There are performance benefits to using fully qualified names even though the execution plans are the same.

For example:

Say you login to sql server using the user name "fred" and you run the following.

SELECT * FROM Shippers WHERE ShipperID = 3

SQL Server will look in the cache to see if this resultset can be found there. Now, initially SQL Server will look for the table fred.Shippers (because that is your username). This will generate a cache miss and then SQL Server will look for dbo.Shippers.

The same applies to stored procedures.

By not qualifying your object names when calling them you could be making SQL Server look in the cache for that object twice.

This of course wouldn't happen if you logged in using an sa account because such an account will be assuming the "dbo" user by default. Of course, you shouldn't be letting people log in using an sa account so the chances are that you'll gain something by fully qualifying the object names you call.

You're correct about specifying the database: that's not really an issue if your T-SQL is running against a single database.

There is an improvement in performance over time when you always mention the object owner, because when you don't then SQL Server must determine which object you're actually referring to. First, it will look for an object with that name owned by the current login, and if that cannot be found then it starts looking for an object owned by dbo.

The underlying problem here is actually that SQL Server cannot reuse execution plans if it doesn't know beforehand the owner of the object, because in that case it doesn't know which statistics to trust, and it has to resort to recompilation.