Se você pensar por que o OO foi inventado, verá que não precisa de OOP, mas às vezes isso facilita muito a sua vida.
Nos dias de codificação C, um programa muito grande poderia se tornar bastante confuso e difícil de continuar trabalhando. Então eles inventaram maneiras de dividi-lo em pedaços modulares. OOP adota essa abordagem e a torna ainda mais modular, colocando os dados com esses blocos da lógica do programa para que eles fiquem ainda mais separados do restante do código.
Isso permite que você escreva programas cada vez maiores, seguros de que você transformou seu enorme elefante de uma tarefa em uma centena de tarefas do tamanho de ratos. O bônus adicional é que você pode pegar alguns desses 'mouses' e reutilizá-los em outros programas!
É claro que o mundo real não é bem assim, e a reutilização de objetos nunca é tão bem-intencionada quanto foi planejada, mas isso não significa que seja um paradigma inútil.
O que é inútil é uma dependência excessiva de qualquer estilo de codificação. Qualquer pessoa que faça OO com milhares de classes pequenas e insignificantes não está realmente fazendo o certo - está criando um pesadelo de manutenção para si (ou para outra pessoa). Qualquer pessoa que escreva um aplicativo de procedimento com apenas três funções também está dificultando a vida. A melhor maneira é os objetos grandes e médios (às vezes chamados de componentes que parecíamos estar indo uma vez) que podem fornecer uma quantidade razoável de código e dados independentes com maior probabilidade de serem reutilizados isoladamente do resto do seu aplicativo.
Meu conselho para a próxima vez: tente escrever seu código de procedimento usual, mas crie um único objeto da sua estrutura de dados principal. Veja como você acha que trabalhar com isso é mais fácil do que passar dados de uma função para outra.