Sure, there are edge cases where inheritance is truly the best way to do things, but those are few and far between.
I cringe every time I dive into some of my day job's more deeply inheritance based code. It is SO hard to make changes there without breaking a bunch of stuff unintentionally.
More importantly OOP is not merely a bag of syntax and features but a way of thinking about software development and structuring your programs. OOP says you organize your code around objects and the actions done on those objects.
That is something I find that often isn't a great way of structuring your code. But I don't think OOP is useless. I do use OO thinking in my code, just not as much as I used to. I prefer functional thinking. Often I organize code arounds verbs rather than nouns. So one file may be a similar kind of action performed on many different kinds of objects.
E.g. when writing a rocker simulator, I would have one source code file which contained mass calculations for a variety of objects.
Another file would contain rocket thrust calculations.
I would say though that in GUI programming I find that OO thinking tends to make a lot of sense.
I'd argue that inheritance is really the core of OOP (and by extension methods, which are only different from functions insofar as they interact with inheritance).