why is markup routinely placed in functions in wordpress?

I think WordPress is one of the cases where the original code just got bigger and bigger without having a chance to be rewritten from ground up with best practices.

In this case, I think the WordPress conventional practice (writing markup in function) outweigh the best practices.

You might find the theme development documentation interesting to see the rules theme authors follow to develop themes:
http://codex.wordpress.org/Theme_Development