From my experience, commitments to backwards/forwards compatibility are the gilded cage of the software engineering industry. I have particularly observed this to be the case for document file formats and programming languages/APIs. Customers and partners hate it when their existing data or code breaks; however, if you never break compatibility, you can seriously constrain your ability to innovate in the long run.
Are there solutions to this problem, other than gradual deprecation of old features? It seems like virtualization, as in Windows 7's XP Mode, is one exciting possibility. Are there others?
Also, for those of us who want to design new systems that are as future-proof as possible, what lessons can we learn from past mistakes made in the industry?