This is the way we do, and it works well for us ...
Project | +--01-Development | | | +--Release1.0 | | | | | +--Solution Files | | | +--Release2.0 | | | +--Solution Files | +--02-Integration | | | +--Release1.0 | | | | | +--Solution Files | | | +--Release2.0 | | | +--Solution Files | +--03-Staging | +--04-Production
well, you get the point ...
NOTE. . The directory structure in the Team Foundation Server branches exists only between 01-Development / Release1.0 and 02-Integration / Release1.0, 02-Integration / Release1.0 and 03-Staging / Release1.0, 03-Staging / Release1.0 and 04-Production / Release1.0
In other words, you cannot combine 03-Staging / Release1.0-04-Production / Release2.0, etc.
For us, this means that we have 4 separate environments: development, integration (alpha server), stage (beta server), production.
The beginning of the code begins with development, and then advances as it is tested by QA (integration / alpha) and users (stage / beta) and, finally, into production.
Features / changes are collected and grouped into releases that occur every few months.
But let's say that you are in development for Release2.0, and you get a production problem on Release1.0 ... I can easily get the latest version of Release1.0 and fix the problem and promote it without any action, we worked on Release2. 0
Not to say that it will work for everyone in any situation, but it is very good for us.