Use entity_uri or drupal_path_alias()?
These functions actually have not much in common. There is no question of using one or the other. You will in fact use both of them, although you will most likely not call drupal_get_path_alias() directly.

entity_uri() returns an array that contains the path and options to link to an entity. So for example for a node, you call it like this: entity_uri('node', $node) and it will return node/$node-&gt;nid. That's kinda trivial. It gets more interesting with other entity types, like private messages (where the path is messages/view/$message-&gt;thread_id#privatemsg-mid-$message-&gt;mid).

You use the returned array like this: url($uri['path'], $uri['options']) (or similarly with l()). Then, that function will call drupal_get_path_alias() internally to check if there is an alias for that internal path and will use that.

The idea is that you can generate the internal path for any entity, without any kind of special handling. A real life example is the Userpoints project. Userpoints transactions support to reference an entity by specifying type and id (Yes, Userpoints used the entity_type terminology since Drupal 5...). Previously, there was a large bunch of code with support for nodes, comments and users and a custom hook to be able to support more things. When I ported the module to Drupal 7, I was able to replace all that with a simple call to entity_uri() and it now supports all entities out of the box: userpoints_create_description().