The originals absolutely loaded the enemies as you got close to them, as loading all enemies at once was likely beyond the memory constraints of the older gaming hardware. A lot of crazy and now unnecessary tricks were used back then to minimize memory usage.
Today, I would still opt to loading them on demand as you neared their spawn locations, as it gives more flexibility. Also, you'll notice that in games like Mario, the enemies always appear in the same place moving the same way; so even if you loade them in advance, you'd have to disable their movement until Mario got close enough.
There should be no question about the number of "if" statements, as you should absolutely not be writing code to spawn specific enemies on a specific map. Write a data file to describe your level and enemy spawn points, and then write a single generic block of code to check to see if Mario has gotten close to any unspawned enemies from the data list.
As much as possible, make everything data driven. Hard coded logic makes development slower and harder and, as you pointed out, just isn't a good solution to this problem.