wordpress taxonomy results

have_posts() iterates over all posts found and actually returned in the query which depend in the posts_per_page parameter.

And for your second question, using query_posts() does overwrite the query and its not really the recommend method to alter or modify the query result, here is a nice question that explains better ways : When should you use WP_Query vs query_posts() vs get_posts()?