What is the difference between implementing hook_url_inbound_alter() and hook_url_outbound_alter(), and using a path alias?
Using hook_url_outbound_alter() has some potential performance issues because it is executed by every single URL on a page via the url() function. This means a module could implement hook_url_outbound_alter() with some complex and slow code that is called 100's of times per page.

Also hook_url_outbound_alter() allows a link's $options, including its query string, to be altered, which is impossible to do to path aliases and a very useful feature. For example, I have altered internal RSS URLs to point to their respective Feedburner and iTunes URLs.

Conceptually, the Path module should be calling the hook_url_*_alter() hooks but it is probably slightly faster to have the drupal_get_path_alias() calls directly in url().

My personal conclusion is when possible use the built-in path system, but for most special circumstances you will have to use the hook_url_*_alter() hooks.