Deeply nested inheritance can be a real pain to maintain, or even fully understand. It's hard to know the implications of any changes you make to such a system. It leads to a system that's harder to grok. This is probably a system where everything is over abstracted.
One or two levels of inheritance are easy to keep a mental model of, and can be very useful. 16 levels of inheritance mean you will spend most of your time just documenting all those inheritance chains.
Composition is fantastic, but requires everyone manage their resources well. It means the ability to swap out functionality as needed, or lazily create resources when needed. It also means that you might have a complex dependency chain which makes memory leaks a real problem.
I would say they are both completely reasonable to use, and very powerful when used together. The real priorities here are don't over abstract and find ways to simplify the mental model.