We used TeamCity as our Core Continuous Integration solution for four years. I love TeamCity's easy to use interface, and the way builds and releases are linked together in dependency Chains. I found it particularly helpful that Builds can be run separately, or in advance of Releases - and then when Releases are run the Builds only run again if the code has changed. TeamCity's Templates, Variables, and Parameterization capabilities also made it very easy to establish a flexible template for common solutions such as deploying MVC applications to IIS. Once templates were configured I could create a "build and release" for a new project in less than 10 minutes.
While TeamCity has a simple to use and understand chaining mechanism, allowing builds to call "builds and releases" to rely on multiple dependency chains - TeamCity's PipeLine visualization capabilities are one of its weakest points. I had a complex build across five different environments consisting of eight different solutions and over 20 deployment targets. During a major update, it would have been nice to visualize the deployment pipeline and "watch" the deployment process for issues - but that really isn't possible with TeamCity. Outside of that, TeamCity worked great, integrated well with all of our platforms: Git, Azure, AWS, Visual Studio Team Services.