I'm currently using KeyRemap4MacBook:
<?xml version="1.0"?>
<root>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_Safari</name>
<url>file:///Applications/Safari.app</url>
</vkopenurldef>
<vkopenurldef>
<name>KeyCode::VK_OPEN_URL_iTunes</name>
<url>file:///Applications/iTunes.app</url>
</vkopenurldef>
<item>
<name>test</name>
<identifier>test</identifier>
<autogen>__KeyToKey__ KeyCode::CONTROL_R, KeyCode::VK_MODIFIER_EXTRA1</autogen>
<autogen>__KeyToKey__ KeyCode::F11, KeyCode::VK_OPEN_URL_Safari</autogen>
<autogen>__KeyToKey__ KeyCode::I, ModifierFlag::EXTRA1, KeyCode::VK_OPEN_URL_iTunes</autogen>
</item>
</root>
If you have the Powerpack for Alfred 2, you can create a workflow like this:

Hotkeys have a short delay by default, but you can reduce it by changing the trigger behavior:

Other applications that support assigning shortcuts to opening applications:
Apptivate, BetterTouchTool, Butler, iKey, Keyboard Maestro, KeyLauncher, Keymando, Launch it!, NuKit, Quickeys, Quicksilver, RocketShip, Shortcuts, Spark, Twitch
You could also assign shortcuts to shell commands like open -a TextEdit. open /Applications/TextEdit.app/ doesn't seem to be any faster. The script below is blocked until TextEdit finishes opening, and it raises all windows instead of a single window:
tell application "TextEdit"
reopen -- open a new default window if there are no open windows
activate -- make the application frontmost
end tell
Another option would be to use Automator services:

There is a bug in 10.7 and 10.8 where the shortcuts for Automator services don't always work until you hover over the services menu from the menu bar. There is also a small delay before services are run, and shortcuts for services don't work when an application that doesn't have a services menu is frontmost.