Deixe-me dar um exemplo baseado na experiência. A maioria das bibliotecas que uso diariamente usa o OOP de alguma forma. OOP é capaz de esconder a complexidade necessária para muitos domínios, não é um mecanismo que realmente ajuda no desempenho. O que pode acontecer é que uma biblioteca é capaz de usar otimizações específicas com base na hierarquia de objetos, mas a maior parte é sobre ocultar a complexidade do usuário. Pesquise os Padrões de Design, eles são os mecanismos frequentemente empregados para realizar essa ocultação de complexidade.
Tome o PETSc como exemplo. O PETSc usa um modelo inspetor / executor de OOP, em que qualquer um de seus algoritmos analisa as rotinas disponíveis em um determinado objeto e escolhe o que executar para realizar a rotina. Isso permite que o usuário separe preocupações, por exemplo, a ação da matriz pode incluir qualquer tipo de rotina bloqueada ou otimizada e ser efetivamente usada por vários solucionadores iterativos. Ao dar ao usuário a capacidade de especificar seus próprios tipos de dados e avaliações, eles recebem algumas rotinas importantes e também têm toda a funcionalidade da biblioteca ainda disponível.
Outro exemplo que darei é FEniCS e deal.II. Ambas as bibliotecas usam OOP para generalizar um grande número de métodos de elementos finitos. Em tudo, desde o tipo de elemento, a ordem dos elementos, a representação em quadratura e assim por diante, é intercambiável. Embora essas duas bibliotecas sejam "mais lentas" do que alguns códigos FEM estruturados para fins especiais, eles podem resolver uma ampla variedade de problemas com grande parte da complexidade do FEM desconhecida pelo usuário.
Meu exemplo final é Elemental. Elemental é uma nova biblioteca de álgebra linear densa que levou a dificuldade de gerenciar comunicadores MPI e localização de dados para uma construção de linguagem muito simples. O resultado é que, se você tiver um código de série FLAME, alterando os tipos de dados, também poderá ter um código paralelo via Elemental. Ainda mais interessante, você pode brincar com a distribuição de dados configurando uma distribuição igual a outra.
OOP deve ser pensado como uma maneira de gerenciar a complexidade, não um paradigma para competir com a montagem enrolada manualmente. Se o fizer mal, resultará em muita sobrecarga, portanto, é preciso manter o tempo e atualizar os mecanismos com os quais eles a usam.