TCP is a bad example because it has become so hard to replace.
SCTP failed to replace TCP for various reasons, such as too many middleboxes filtering ULPs that aren't TCP or UDP, or SCTP being far to rich and complex, or just inertia.
But TCP has had a ton of problems, and while there has been a ton of research into those problems and the solution spaces for them, adopting even hacky solutions into TCP has been difficult. As a result, TCP has gotten complex and bloated over the years without at the same time solving all the problems that a new protocol could solve.
On the plus side, in spite of inhibiting innovation at the transport layer, TCP enabled innovation at the application layer by making the application layer possible at all.
SCTP failed to replace TCP for various reasons, such as too many middleboxes filtering ULPs that aren't TCP or UDP, or SCTP being far to rich and complex, or just inertia.
But TCP has had a ton of problems, and while there has been a ton of research into those problems and the solution spaces for them, adopting even hacky solutions into TCP has been difficult. As a result, TCP has gotten complex and bloated over the years without at the same time solving all the problems that a new protocol could solve.
On the plus side, in spite of inhibiting innovation at the transport layer, TCP enabled innovation at the application layer by making the application layer possible at all.