Some things are cached, like the SiteMap, SiteSettings or any object that is particularly expensive to create and is used frequently.
Other things are stored in the HttpContext like the current SiteUser if the request is authenticated, this way we only lookup the user or other objects one time per request even if they are needed an various places in code to service the request.
Some features also support output caching like the Html feature for example, but features that use postback or ajax postback to the same page cannot use output cache because it can cause a viewstate error if the cached copy being posted doesn't match the current copy.
However, even though some features like the Html module can support output cache it is disabled by default by this config setting:
<add key="DisableContentCache" value="true" />
you could override that to true from user.config and then you will see in the feature instance settings for the html feature (on the general tab) will be an option for the cache duration.
If you click around your site a few times, typically it will be faster because a slow traffic site will be shut down by IIS after 20 minutes of no requests and then it has to be JIT compiled again when it finally gets a request. Once you have clicked around a few times then the site should be considerably faster because all the JIT compiling is up to date. However, if your site is still slow after you have clicked around then the most likely reason is that you have cheap hosting and very little server processor and memory is available to your site. The only solution is to get better hosting.
If you are using any kind of shared hosting or even a dedicated server that does not have lots of RAM, then you should NOT try to use cache because cache uses server memory and that is usually the most precious resource of all. Cache should only be used on a robust server to speed up requests on a high traffic site. In shared hosting you will most likely hurt performance by trying to use cache, because most hosting has IIS configured to recycle your application if it uses a certain threshold of memory. When the app recycles it has to do the JIT compiling all over again and if your application keeps recycling you will have really bad performance.
Hope it helps,