I agree that CSS can be frustrating - but I think it's a bit harsh to state CSS has failed when so many people are able to successfully use it to create a huge range of layouts.
People assume CSS should be easy and straightforward - but like most things, it takes a while to get to grips with.
--
I think there are maybe two main problems with CSS.
One, is that for a long time logic wasn't enough when it came to writing CSS markup. A large number of browser quirks meant that hacks and workarounds needed to be employed all the time. This is luckily changing .. modern browsers are thankfully much more coherent than their previous incarnations.
However, this perceived lack of logically coherence - and the need for arcane knowledge - is obviously infuriating to most people starting out ..
The solution has been to learn a handful of techniques - read a lot, and press on. While it's initially annoying, its not an insurmountable task.
--
The second is that CSS requires a lot of diligence on the part of the developer. There are good ways of writing code. I've found the 'cascading' part of CSS is quite often forgotten about - but well written mark-up can use this to greatly simplify the complexity of spaghetti code.
--
"Example: vertical centering in CSS is far harder than it should be [1]. Why doesn't "vertical-align: middle" just work for divs like it does for table cells? I'm sure there are reasons. They just aren't good reasons. What's more: why hasn't CSS3 fixed this? It's a longstanding problem."
I agree - this is annoying.
However, HTML was designed to allow content to be viewed at various sizes - and to scale width-wise (allowing the vertical height to adapt automatically) - I've a feeling this might be part of the reason why vertical align hasn't been included). Vertically centring fixed height elements is very straightforward .. vertically alignment for dynamic height elements is less straightforward, but it's usually possible.
--
"My other big problem with CSS is the "inheritance" model. For one, it shouldn't be called inheritance. It should be called "cascading" because that's what it is."
The first C in CSS is there for a reason ;) I think the cascading feature is actually quite powerful.
One of the things I'd most like is a way to use variables in CSS - but this will thankfully be addressed in CSS3.
--
"Inheritance at the class level would actually be useful (and is another glaring omission)".
Classes can be combined, and once applied, a class affects the descending elements contained in the DOM. I'm not sure what you'd ideally like?
--
Lastly there are some good projects out there that address quite a few of the gaps in the CSS specifications in a very reasonable way. LESS[1] and SASS[2] are two that come to mind.
[1] http://lesscss.org/
[2] http://sass-lang.com/