<?php

>> Код в контроллере нельзя повторно использовать
> поясни

Смотри, нормальный класс создается и используется как принято в ООП:

$someService = new SomeService($db, $smth, $smthElse);
$someService->doSomething($arg1);

Заметь что этот код не привязан ни к какому фреймворку или библиотеке, он универсален. Он не требует наличия какой-то платформы вроде веб-сервера так как не обращается к GET/POST/COOKIE и подобным глобальным переменным. 

Все зависимости явно указаны и внедряются через конструктор. Ты можешь например создать 2 экземпляра сервиса с разными объектами $db.

Некоторые фреймворки позволяют получать сервисы не через new, а через какие-нибудь DI контейнеры: 

$someService = $container->get('some_service');
$someService->doSomething($arg1);

Но это никак не запрещает нам выкинуть контейнер и создать объект через new.

В общем, это однозначно неплохой код [spoiler]сам себя не похвалишь...[/spoiler]

А теперь посмотрим код, основанный на вызовах методов контроллера извне.

Просто так создать контроллер ты не можешь так как там надо делать определенные вызовы, что-то передавать, и т.д. Например ты должен передать Request c информацией о HTTP-запросе, а где ты его возьмешь если код запускается из командной строки? В некоторых фреймворках код контроллера выполняется внутри  диспатч-цикла — его надо будет повторить.

$ctrl = new Some_Controller($app);
$request = new Request(....);
$ctrl->setRequest($request);
$ctrl->init();

$ctrl->doDomething();

Даже если у тебя получается решить эти проблемы, получается сложный, сильно связанный (с большим числом зависимостей) код, который никакого сравнения не выдерживает с кодом выше.

Зачем класть логику в контроллеры (или псевдоконтроллеры в которые передается объект-контроллер), если можно сделать нормально? 

> где та тонкая грань между переписать и отрефакторить?

Что больше, выгода от рефакторинга или затраты на него. Переписать все приложение явно не даст огромной выгоды, а затрат будет много.

> как возможно вызвать из такого пустого класса модель? он же никак не связан с фреймворком. а для связи я и использую this

Внедрение зависимости через конструктор: 

$s = new Strepsils($model);

Внедрение через метод: 

$s= new Strepsils();
$s->setModel($model);

Внедрение через контейнер: 

$s = $container->get('strepsils'); // контейнер сам позаботится о зависимостях

