Using response caching in action methods and views is essential, but it must be used judiciously, because you do not want your contents to become outdated. Use cache profiles for action methods, as they provide a centralized location, which makes it easier to make changes. Have as many profiles as needed.
Distributed caching can help if you need to share data among a cluster of servers, but be warned that transmitting data over the wire can take some time, even if, trivially, it is faster than retrieving it from a database, for example. It can also take a lot of memory and thus cause other unforeseeable problems.
Bundling and minification are also quite handy because they can greatly reduce the amount of data to be transmitted, which can be even more important for mobile browsers.
Asynchronous operations should also be your first choice; some modern APIs don't even allow otherwise. It can greatly improve the scalability of your app.
Finally, do use a profiler to identify...