En gros, c'est ça.
Lorsqu'un visiteur va faire une requête, le routeur va l'envoyer au contrôleur (je simplifie), qui va générer les bases pour la session. Il va, par exemple, initialiser les variables de session et les données temporaires. Suivant les besoins de la requête, il va demander des infos supplémentaires au Modèle (en fonction des permissions, généralement), qui va lui les renvoyer. Avec ça, le contrôleur peut envoyer toutes ses données à la Vue, qui va générer la page html (la Vue en tant qu'entité MVC peut contenir autre chose que du HTML, généralement des outils de templating intégrés, pour être générés en HTML une fois la réponse du serveur).
Généralement, on considère qu'il faut avoir des modèles obèses, des contrôleurs en forme et des vues anorexiques. Plus concrètement, ça veut dire que les traitements lourds doivent être gérés par le Model, les traitements rapides, les helpers localisés et les petites requêtes par le Contrôleur, et aucun calcul ne devrait être réalisé par la Vue. Elle ne fait qu'afficher ce qu'on lui envoie, dans l'idéal elle ne devrait rien décider.
Pour le Modèle, note que je parle de lui en tant qu'entité, d'ensemble de modèles. L'ensemble peut être 'gros', mais, au cas par cas, tu peux choisir d'avoir une multitude de petits modèles qui gèrent chacun une responsabilité (design objet plutôt propre), ou peu de gros modèles qui englobent des responsabilités (moins propre, mais parfois utilisé pour des questions de performances).