Throwing out X11 because some features of it are legacy is and always was the entire point. And I don't think it's justified or good engineering practice.
According to my recollection, it was more that the codebase became difficult and unpleasant to work on to the point that it was becoming unmaintainable. And nobody was interested in cleaning it up because that was just not interesting work
That's true, it was a bit of both. But in my experience "codebase became difficult and unpleasant" usually just means that the codebase is large and complex, and people don't want to take the time to understand it. It's always funny to me that people will talk about how elegant a codebase is one day, and the very next decide that it's crufty and old. Did it flip overnight? Did the cruft build up while they were calling it elegant? No, the only thing that changed was the complexity level. When people say cruft, I usually assume they're just frustrated by necessary complexity.