The work is in some ways a reaction to all the numerous wierdo protocols people build--- either explicitly or in an ad-hoc manner on top of UDP. A lot of times people set out to roll their own and end up duplicating a lot of TCP's features that they initially thought they didn't need. There is also a very real sense that TCP might be the only protocol we get to use; anything else is going to be even harder to deploy, harder to get through firewalls, might not be allowed by router ACLs, doesn't work with NAT, etc.
Real-time delivery is the biggest problem people seem to have with TCP. (Unless they're trying to load up their entire multi-gigabit link with a single TCP flow...) Sam's design provides a way around this, that is probably good enough for most applications. Check out his TCP-RTM paper if interested.
Framing is a big issue; the approach we've been thinking about lately is to use application-layer framing (which is necessary for the reasons you mention), but to change TCP's behavior to respect write() boundaries. Thus, an individual TCP segment (and a read()) contains bytes from no more than one application-layer frame.
I think you've nailed it on the head about "Worse is Better": TCP may often be not quite the right thing from an end-to-end perspective, but it's so much easier (and better engineering) to use what's already there than try to come up with something better from scratch. I'd argue (donning my asbestos suit) that the same thing can be said about IPv6 and NAT: one looks better from an e2e perspective, but a solution which just fixes NAT's problems will be a lot easier to deploy (and not necessarily violate the e2e argument, either.)