Just to reaffirm what Jeff is saying, Moodle is pretty good with its Cache-control headers. It sets "public" and "private" appropriately, and has good "max-age" directives for things like the theme. But these settings are really only useful for *returning* users. First-time visitors, or people who dump their browser cache at shutdown, won't have any of your site assets stored locally.
It's not clear what your architecture is. Do you have the web server, database and files all on one machine, or have you scaled out?
If your moodledata volume is remote to the web server, you might find (as we do) that you get a lot of performance improvements from having a key/value store like Memcached.
https://docs.moodle.org/33/en/Caching
Turn on "performance info" in the "debugging" section of the admin menu (/admin/settings.php?section=debugging) and switch to a theme that displays it. This will give you clues.
Above all, make sure you've tuned your database as finely as you can. If you're using
MySQL, the quickest possible win is to ensure you've set InnoDB's Buffer Pool settings (especially innodb_buffer_pool_size and innodb_buffer_pool_instances) appropriately. Get as much of your DB into memory as you can, so you stay off those disks.
https://dev.mysql.com/doc/refman/5.6/en/innodb-buffer-pool.html
Chris