Please note that this is not necessarily the right way to do this, but I'm going to explain how the framework can do this, as usual, and then you can learn about other methods and choose the best one for your use case. Therefore, I do not expect this answer to be correct, but I hope that it will give at least a little knowledge about how everything happens, before someone who really knows what they are talking about comes and rings ( also to these people - please feel free to edit / lower this answer: D). Finally, this also has nothing to do with CodeIgniter, but the frameworks in general. Your question should not only be formulated as independent of structure, but also of language.
Therefore, I am going to express my opinion here, and it is the fact that all modern frameworks, especially in PHP, do not support MVC . Why is it important? Because we all need to speak the same language, and mvc does not exist in PHP. It is a fact. Agree to this, and then we can move forward towards adhering to the concept that platforms use; and CodeIgnitor is a particularly good example of the meanness of 'MVC'; henceforth known as "MVC" with quotation marks.
On the plus side, frameworks like Symfony, for example, provide an initial weighted architecture that at least contains some form of consistency in the application, and it looks something like this:
A standard HTTP request arrives and gets to the front controller, usually app.php or app_dev.php depending on whether you are in development or production; One includes a lot of caching that needs to be run with every change, and the other is not, which is ideal for development.
The router maps the current URL to the controller class and the "action" (method) in this class.
Part of the implementation of the framework dependencies finds out what objects are needed for everything from the controller to the model level and vice versa, and either creates instances or prepares to create them when necessary.
The controller is created with any necessary dependencies and the corresponding method is executed. Usually you start your development and “connect your code” to the framework.
Here you choose your architecture, but the most important thing both from the point of view of the developer and from the point of view of the business (to reduce maintenance costs in the future) is consistency.
I personally prefer that my code be separate from the framework. I pass the scalars taken from the request to the application level service, which uses objects from the model level (passed through DI) to use domain objects. The fact is that domain objects are not transferred directly to the controller, they are proxied through the application level environment, so you can theoretically replace the entire infrastructure surrounding it, and yet, all you need to do is transfer these scalars to this level before they get to the model level and everything works (think about CLI calls, there are no more controllers).
Application-level service uses any necessary Repositories , Services etc. (And passes these scalars to them, remember the separation?) That execute business logic (usually this is where your design patterns come into play on a day to day basis.), And then return this data to the application-level service.
The service then returns the data to the controller and guess what? This is where frames tend to screw up! Because in the modern framework there is no concept of "view". There is only a template, and you transfer this data to the template and send it. So, in your diagram there is absolutely no concept of representation, because this is not how everything is done. And to be honest, I still use templates because it’s the fastest way to do something, but until modern frameworks get together and start using Views, we’re out of luck, and we must remain persistent when faced with the fact that some (like Laravel) call themselves mvc frameworks.
Please note that Fabien Potencier explicitly states that Symfony was not an MVC framework - at least he knows what he is talking about. Again, this is not a purist, it is important that we all speak the same, actually the right language in computer technology.
So, since you like charts so much, here's how some can do it with today's frameworks ...
This is for an application that has a Review and Criteria concept for each Review . And don’t even start me with Symfony forms, they are so connected to everything that they are not a serious part of any architecture.
How many layered layers do you need? We already have "MVC", in DDD we have the concept of separating "Application", "Domain" and "Infrastructure", so first these two groups work together, and then this "level of service"? Do you really need another layer, or is the above enough? Things to think about ...

You see, you are not stuck with a framework / http request to launch the application as a result of this separation.
See the "services" in the above diagram? They are separate from the controller, so you can drop the scalars from anywhere, and the application will still work. I think this will give you the necessary separation . It’s great to do things right, learn how to do it, and then learn how to control yourself and be pragmatic when it comes to business, and this is necessary, but frameworks need to figure out their things - and you certainly don’t You will write beautiful code with CodeIgniter;)