Pretty sure a single flat non-normalized table will nearly always be faster (in terms of accessing the DB) than doing a bunch of joins. But it's also quite a bit harder to actually do anything with the data. It's the old tradeoff between computer speed and ease of use.

If I'm worried about speed, I tend to fetch as much data as possible out of the SQL server all in one big dump and then loop over it in whatever script is running the frontend, rather than doing filtering / data manipulation in the queries themselves. I may be entirely wrong as to whether that increases speed or not. It certainly makes programming eaiser though.

It's hard to answer without knowing more about what you're doing. Have you ever used EXPLAIN? http://dev.mysql.com/doc/refman/5.0/en/explain.html It'll tell you if you're using indexes properly. Indexes can help you a lot if you use them properly.