That demo looks to me like your program spawned a process that finished after your main program returned. exec doesn't spawn a shell. Rather it starts a process that runs on its own independent of your main program. To quote the Perl docs "The exec function executes a system command and never returns". This new process can finish before or after the first process. If the old process finishes first it will display the command prompt before the new process spits out its own output.
You are seeing the "$" before the 1/2 due to a timing issue. See exec.