Using natural keys for identification purposes is a good idea whenever natural keys can really be trusted. See Marc_S response for some cases where natural keys cannot be trusted. Don't worry too much about efficiency. Even something long like the VIN (Vehicle Identification Number) won't drag your database down very much. If you think it will, make a few tests, realizing that efficiency does not scale linearly.
The primary reason for declaring a primary key is to prevent a table from slipping out of first normal form, and thereby no longer representing a relation. The use of an autoincremented surrogate key can result in two rows with different id fields, but otherwise identical. This will bring you some of the problems that go with data that's not in first normal form. And the users won't be able to help, because they can't see the id field.
If a table's rows can be determined by some combination of two or more foreign keys, what you have is a relationship table, sometimes called a linkage table or a junction table. You are usually better off to declare a composite primary key consisting of all the needed foreign keys.
If the above choices result in slow preformance, sometimes that can be remedied by creating some extra indexes. It depends on what you are doing with the data.