... who's going to write the test suite for and maintain the software which does the code generation?
In my experience the only time that an abstraction like that makes sense is if you know that the targets will change, e.g. abstraction of SQL can make sense if you don't want to be too dependent on which database you're targeting (although my experience has sometimes also been that you eventually do end up using database-specific features anyway, so if you had decided to marry one database at the beginning of the project, you could have avoided the extra abstraction layer).
Other than that - you'll usually only be targeting one version of HTML, one version of JavaScript, etc. - what would the advantages of writing a code generation tool to abstract that be?
Also, right after you say "keep code from different languages mainly separate", you name four "exceptions"... if you spend some more time looking around, I'm pretty sure you'll find that mixing languages is actually pretty common.