I find that very easily my views become cluttered with logic, e.g. null checks, email validation, and retrieving values from the post object. How would you separate this out in WordPress? Is there any sort of MVC framework?
There is no clear separation enforced by WordPress and there is extremely wide range of styles and opinions on this. Simply put you are either on your own managing this in your code or you can look for third party framework and/or convention to make use of.
should I create another plugin with shared functionality, or put shared functionality in the functions.php file?
Since everything is in global scope the question “where things go” is primarily semantic rather than technical. Again you either look for opinion or make up your own about it.
As I mention above, is everything global in WordPress? My impression is that other plugins might very well have function names that clash with my function names; that’s why you prefix functions with your themes theme name. Is there a way to avoid this?
Use PHP namespaces. Well, as above even this is more of an opinion since natively WP aims for compatibility with obsolete PHP 5.2 version and isn’t making use of namespaces in core.