Graças a um tópico do github compartilhado por Grégory NEUT nos comentários da pergunta pude estabelecer alguns fatos:
- O método populate() do Mongoose não usa $lookup do MongoDB nos bastidores. Ele simplesmente faz outra consulta ao banco de dados.
- O Mongoose não possui funcionalidades que o MongoDB não possui.
populate()apenas faz duas ou mais consultas.
Na minha opinião, existem lugares para usar
populate() e outros para usar $lookup . Para consultas mais complexas $lookup em um pipeline de agregação funcionaria melhor.