So if I understand that example correctly, you're not actually writing anything into the code segment; you're pushing instructions on the stack and executing them there, right? So I guess it's self-modifying, but to me that's always meant actually modifying code in the code segment.
Anyhow, pretty clever there. I guess you could even handle code that's longer than 32 bits with multiple PUSHes, right? I'd call what you're doing here "on-the-fly stack subroutines".