I think OOP can easily result in spaghetti code. It can result in code that is harder to read than code with a lot of "goto" statements.
I think it can be used in moderation, i.e. for representing base/core data entities. But beyond that (like business logic or codes to process/manipulate/transform the objects), I think you are better off write imperative code, or of course, functional approach.
Composition is better than inheritance.