Let me give an example based on experience. Most libraries I use from a day to day basis use OOP in some way. OOP is able to hide the complexity required for many domains, it is not a mechanism that really helps with performance. What can happen is that a library is able to use specific optimizations based upon the object hierarchy, but for the most part is about hiding complexity from the user. Look up Design Patterns, they are the mechanisms often employed to accomplish this complexity hiding.
Take PETSc as an example. PETSc uses an inspector/executor model of OOP where any of its algorithms looks at the available routines in a given object an chooses which to execute to accomplish the routine. This allows a user to separate concerns, for example the matrix action can include any sort of blocked or optimized routine and be effectively used by numerous iterative solvers. By giving the user the ability to specify their own data types and evaluations, they get a few important routines sped up and also have the entire library's functionality still available.
Another example I'll give is FEniCS and deal.II. Both of these libraries use OOP to generalize over a large number of Finite Element Methods. In both everything from element type, element order, quadrature representation, and so on is interchangable. While both these libraries are "slower" than some special-purpose structured FEM codes, they are able to solve a wide variety of problems with much of the complexity of FEM unknown to the user.
My final example is Elemental. Elemental is a new dense linear algebra library that has taken the difficulty of managing MPI communicators and data location to a very simple language construct. The result is that if you have a FLAME serial code, by changing the datatypes you can also have an parallel code via Elemental. Even more interesting you can play with the data distribution by setting on distribution equal to another.
OOP should be thought of as a way to manage complexity, not a paradigm for competing with hand rolled assembly. Also doing it poorly will result in a lot of overhead thus one must keep timing and updating the mechanisms they use it with.