The problem is not a management structure. It is having bad managers. A hierarchal structure works perfectly fine as long as the managers actually know how to manage.
The mistake most companies make is making someone a manager based on the ability to do their job. Just because you are a great developer doesn't mean you are going to be a great manager of developers. This method is doubly stupid when you consider that by promoting your best performers to a management role, you are decreasing your efficiency, since you just took one of your best performers out of the mix.
If you are looking for the best manager, you have to look beyond the performance of the job to the softer skills that actually make great managers, which could be in folks who aren't that great at coding. However, you also need to develop a non-management track to keep those great coders from topping out too quickly, but also allows them to continue to contribute.