Yes, in assembler, it had those uses.
Today, however, only #2 applies, as you can't rely on timing with modern CPU's, which has instruction cache, execution queues, predictive branching and stuff like that, and also lives in an environment where they can't simply read memory, as some other component (other CPU/CPU core, GPU, PCI bus controller et cetera) also access the memory bus.
Even #1 does only apply partially, as most (PC) CPU's have prevention against modifying running code. It's still useful for "commenting out" blocks of code, when you don't want to move things around in memory (sometimes an issue on microcontrollers or when you have programs residing on several ROMs/EPROMs, and only want to change one).
However, in high level languages, it's more of a formalized comment stating "I'm intentionally not doing anything here!".