Gracias a un hilo de github compartido por Grégory NEUT en los comentarios de la pregunta he podido establecer ciertos hechos:
- El método populate() de Mongoose no utiliza la búsqueda de $ de MongoDB entre bastidores. Simplemente hace otra consulta a la base de datos.
- Mongoose no tiene funcionalidades que MongoDB no tiene.
populate()solo hace dos o más consultas.
En mi opinión, hay lugares para usar populate() y otros para usar $lookup . Para consultas más complejas $lookup en una canalización de agregación funcionaría mejor.