Não que eu tenha lá muito conhecimento sobre, mas acho que consigo responder a essas perguntas:

Qual é o propósito em usar?

Assim, quando voce carrega um componete, e quer que ele tenha alguma informação de alguma api , voce pode usar o UseEffect para quando o componente for renderizado ele busque essas informações e atualize o seu estado, assim exibindo a resposta da api que voce queria, isso é util em varias situações, como buscar dados de um usuário ou algum registro aleatório

Por que usar?

acho que isso entra dentro de resposta anterior, mas um motivo é porque é amplamente ultilizado e há varios exempos que voce pode seguir

Tem alguma alternativa melhor? Se sim, por quê? existem hooks como esse abaixo https://tanstack.com/query/latest eles tem alguns recursos a mais do que o UseEffect nomal

Só complementando seu comentário. O propósito do usseEffect não é fazer chamadas em API. Uma chamada não é um efeito colateral. Um outro exemplo seria abrir uma modal assim que o conteúdo é carregado ou capturar dados do localStorage.

Pra fazer chamadas em API, recomendo o SWR. Ele é mantido e foi criado pela Vercel e já trás informações importantes que normalmente usando o useEffect você precisaria ficar criando estados, como isLoading, error e isValidating. Além disso ele deixa aberto para fazer a chamada com a tecnologia que quiser: Axios, fetch, etc. É interessante porque você também consegue personalizar se quer que os dados atualizem automaticamente ao retornar para a aba, o quando a internet é restabelecida.

Enfim, espero que esse comentário ajude um pouco.