На самом деле не нужно возвращать экземпляр \Magento\Framework\View\Result\Page. execute, Как ожидается, возвращает экземпляр класса , который реализует интерфейс \Magento\Framework\Controller\ResultInterface.
\Magento\Framework\View\Result\Pageэто только один возможный возврат.
Другие возможные возвраты
\Magento\Framework\Controller\Result\Redirect
\Magento\Framework\Controller\Result\Raw
\Magento\Framework\View\Result\Layout
\Magento\Framework\Controller\Result\Forward
\Magento\Framework\Controller\Result\Json
и могут быть другие.
взгляните на метод Magento\Framework\App\Action\Action::dispatch().
Это должно вернуть экземпляр \Magento\Framework\Controller\ResultInterfaceи в зависимости от результата предпринять различные действия, снова вызывая методы, объявленные в ResultInterface.
Этот dispatchметод вызовы , $result = $this->execute();который является executeметодом от действия контроллера. Поэтому я предполагаю, что это для согласованности и упрощения введения другого поведения для действия контроллера. Вам просто нужно добавить новый класс, который реализует, ResultInterfaceи все это будет обрабатываться фреймворком.