Performance, not much. It's just a bit clumsy: in a table, say, with 10 columns, joined on two other tables or even more, particularly with large result sets, SELECT * can return dozens of columns, often with mostly unused or even useless data. In terms of the hit on the DBMS, there wouldn't be much, but all that data still needs to travel across the wire somehow; network bandwidth and consequent latencies certainly add up. I've seen this first-hand in high-volume environments. It definitely matters.
Aside from the bandwidth issues, you can also run into ambiguous column-naming problems (disambiguating usually means removing SELECT * anyway, so you might as well do it from the start), and it's also considered good practice to be explicit about the needs of the code inside the code; doing so helps in lots of ways -- with debugging, with collaborating, etc.