We switched from Sourcegear's Vault (w/ Bugzilla) to Kiln (w/ FogBugz) last Fall. All of our developers love the tight integration of commits to code reviews to cases (bugs/tickets) to specs/requirements.
It took some trial and error to master the organization of the central repositories. Kiln (and Mercurial by proxy) is so flexible that you can easily construct an organizational structure that is either too simple or too complex. This is significantly mitigated by the ease with which you can branch and merge. Our goal was to construct a system which allowed only reviewed code into a staging repository which could then be deployed for release to QA. It took about 6 weeks (mostly to trial and error) to finalize our repository organization to streamline this process.
While in Vault (comparable to Subversion from a philosophical standpoint), you could easily commit a change which could cost hours of time reversing, in Kiln it is trivial to make changes and throw them away. While I can't speak for TFS, compiling for release in Vault was a nightmare. Take 90 minutes of productivity and trash it. In Kiln, it's trivial to write a few Perl scripts to automate build/release, which would now be almost instantaneous if not for a few minutes of manual review.
The biggest challenge (as Helgi suggests) is managing branches. Some developers find this extremely easy, others struggle with it.
There was no conversion path from Vault to Kiln either, so we maintain the Vault server instance for archive purposes and started fresh with Kiln.
6 months in, and it has changed our lives (for the better).