Como a própria documentação diz, useEffect é uma ferramenta para sincronização com sistemas externos.

A frase "você não precisa usar useEffect" também vem da documentação, que tem o sentido de que se você está usando useEffect para qualquer outra coisa que não seja sincronização entre sistemas, provavelmente você não precisa dele e existe uma maneira mais eficiente de fazer essa "outra coisa".

Data fetching é sim OK de ser feito em useEffect, pois nada mais é que sincronização entre sistemas. Porém, como já comentaram, hoje existem libs que são mais eficientes e inteligentes para isso (como SWR)... Mas ainda assim, não é um pecado fazer data fetching em useEffect e inicialmente essa era a unica forma de realizar esse tipo de sincronização.