Learning?
Start with AVR. No contest.
It's available, it's common, it's well documented (if not always by the manufacturer... but Atmel is no Microchip, let's just say that!), and it's easy to learn (nearly orthogonal -- i.e., instructions with a given input/output mode, follow the same scoping (reg/imm/mem) rules, for the most part), and it's practical (AVR is current gen, if not the most popular perhaps?).
Z80 I'd say is a close second, because it's also easy to use, but has the advantage of being more user-friendly: the instructions do more. AVR is RISC style (load-store architecture), meaning to do the least of almost any elementary operation takes three instructions or so. Z80 has some of that as well, but it's more powerful. And also slower (the original being 3-4 clock cycles per instruction cycle, with the longest instructions taking several instruction cycles to complete).
BTW, I think eZ80 is different, so don't dive into that, expecting classic Z80.
Once you know an instruction set, you can move on to heavier and more thoroughly demented things, like x86...

Doing DOS programs in MASM is pretty easy, but you most likely will not be doing full Windows applications with 32 bit instructions (or 64, for that matter), and floating point and SIMD extensions. At best, those should be left to the core inner loops, with a good trusted compiler filling in everything around. And anyway, almost all things done on that serious of a level, are done relatively quickly -- the CPU operates on what data it has available locally (top level caches), then finishes, waiting for more data from the lower level caches. It's not so important to hand-optimize inner loops for this reason. Optimization today is more about cache size and prediction, being able to get data to the CPU just as it needs it. A poorly written algorithm can waste so much time if it's grabbing data randomly. That, and multiprocessor design (using other CPU cores to share the effort, or doing it on the GPU for that matter).
Tim