Суть в том, что ООП - это подход для того, чтобы уменьшить сложность СЛОЖНЫХ программ.
Поэтому когда вы берете простой пример с тремя птичками или "cat says meow, doggy says bark", то разница не видна. В особо тяжелых случаях ООП код будет даже казаться более сложным, чем обычный if или switch.
Представьте себе код какой-нибудь игры, масштаба warcraft, например. Там где есть несколько десятков разновидностей юнитов - всякие эльфы, орки, люди, палладины, лучники, снайперы, драконы, катапульты...
Все они основаны на одном классе Unit, у всех есть много общего кода - методы получения координат, получение урона, отображение хелсбара, команды типа "держать позицию", "патрулировать" "атаковать"...
При этом есть и различия в поведении - разная скорость, разные показатели урона, здоровья, брони, размера. Даже алгоритмы поиска пути могут отличаться, т.к. часть юнитов могут пройти в узком проходе, другие не могут, а кто-то вообще может летать,
И если написать это на ООП, то у вас будет класс Unit с общими методами, и несколько десятков классов
Paladin extends Unit
GoblinTechies extends Unit
GoldenDragon extends Unit
в каждом из которых учтены особенности конкретного типа юнитов.
А если без ООП, то у вас остаются условные операторы. Десятки условий для здоровья, еще десятки для брони, еще десятки для скорости, и в итоге каша такого размера и сложности, что работать с этим в какой-то момент станет невыносимо.