Смешались в кучу кони, люди...
ООП нужен для управления сложностью.
В простых проектах он только вносит лишний головняк в плане проектирования, но в сложных - позволяет разделять огромную ужасную бизнес-логику на какие-то отдельные блоки/модули/классы с которыми можно работать не пытаясь затолкать в голову весь проект.
Вот я юзаю метод Billng.getUserBalance() и не задумываюсь что там внутри этого getUserBalance()
может там чтение из файла, или запрос к базе данных, или может лазером посылают сигнал на луну - меня не волнует, мне только циферка нужна.
Паттерны (шаблоны проектирования же) нужны для того, чтобы объяснить ДРУГИМ ПРОГРАММИСТАМ что за хрень мы тут написали.
Можно писать код, который вообще ни на что не похож и не соответствует никаким шаблонам. И тем людям, которые захотят разобраться в коде вынуждены будут его прочесть целиком и осмыслить. Или мы пишем: здесь у нас шаблон "наблюдатель" а вот нам у нас singleton и всем сразу понятен общий смысл.
С MVC пример не особо удачный. Дело в том, что сейчас существует довольно много разных штук на которые почему-то прилепили буковки MVC, хотя
на самом деле... В целом понятно, что вы пишете о случае с "толстыми контроллерами" но ведь может быть несколько разных контроллеров которые работают с одной моделью.
И могут быть разные модели, отдающие данные в одно и то-же представление. Но об этом ниже.
И с полиморфизмом вы что-то напутали. Посмотрите хоть в википедии что это и зачем. Клиентов ведь может быть больше одного. Сегодня наш код работает на телефоне с ios, завтра на andoid'е, а послезавтра на голографическом телевизоре с пси-управлением. И данные он вчера брал из MSSQL а сегодня берет из mongodb. Но при этом у нас все круто спроектировано, и мы
не меняем ядро приложения. Только подсовываем новые реализации интерфейсов по необходимости. Вот про что полиморфизм.