You can speed up a drupal site by setting some of the options found in admin/settings/performance page.

Settings that needed to be set at that page are :
1. Enable the caching option, set to "normal" to ensure compatibility with other contribution modules
2. Enable the page compression option, if your web server support this
3. Enable the block caching, this could pose problem with other contribution module especially if the contribution module loads the js or css via hook_block not via hook_init and if the contribution module needs to fetch data dynamically.
4. Enable the optimize css option. This should be safe for most case and absolutely needed if you want Internet Explorer to view the site correctly, due to IE css file limitation.
5. Enable the optimize js option. This option will pose problem if one of the javascript found in your site contain error. The most common problem is the trailing "," found in jQuery object last array. Internet Explorer prior to IE 8 will render this as "error". So if you enable this then your site js broken, most likely you got an error on one of the script that being aggregate into one large js file.

Now that is just standard drupal practice right?. What if you want to optimize more?.

Next step is to get this 4 contribution modules :
1. Javascript aggregator module
2. CSS tidy module
3. CSS gzip module
4. CSS emimage module

Javascript aggregator module

This module will gzip & minify your aggregated js. so the process is fetching the aggregated js that the drupal core created (remember the 5th step above?), run it through jsmin or jsmin+ to create a minified version of the script and then compress it using gzip.

The result may vary from site to site, in my case the size of the js script went from 200 kb ++ down to 60 kb ++, quite a significant drop in terms of file size.

The only catch of this module is, from my testing on a shared server with 96MB memory allocation, if I enable the "minify using jsmin++" option then the server will return White Screen Of Death due to php memory exhaustion. So be warned, once you got WSOD you may need to reset the option either via the module code or via database by phpmyadmin.

In case you got yourself a broken drupal site due to this problem, you can edit "javascript_aggregator.module" file and look for line 104

and change it into :

  if (variable_get('javascript_aggregator_jsminplus', FALSE)) {
    // JSMin+ the contents of the aggregated file.
    // require_once(drupal_get_path('module', 'javascript_aggregator') .'/jsminplus.php');
    // $contents = JSMinPlus::minify(file_get_contents(file_directory_path() . $aggregated_file_name));
  }

it should then allows you to return to the performance setting page, there you can disable the jsmin++ option, save and clear the cache.

CSS Tidy

This module basically is packed / minify your css file by grouping similar css property and eliminating white space.

If you write your css neatly then probably the most this module can shave off your aggregated css file is like 10% of it size.

One glitch of this module is it keep showing the message of successfully shaving of your file size. to disable the annoying message please consult http://drupal.org/node/783520

CSS Gzip

This module is a beauty, it just works! without the need to modify anything. the only thing that you need to do is enable the gzip option found on the performance page.

CSS emimage module

This module is actually going to print the content of image in the css file, so it is kinda like merging the css file with the image file as specified in the css file.

The advantages of this creating a "large" single css file that contains all the images comparing to spliting the css file with many images. by creating a single file, thus the browser need not to make many http request to server.

Project page for all the module :
1. http://www.drupal.org/project/javascript_aggregator
2. http://www.drupal.org/project/csstidy
3. http://www.drupal.org/project/css_gzip
4. http://www.drupal.org/project/css_emimage