In your short example, you're likely suffering from buffering. A $|++ (see perlvar) in delayme.pl should take care of it. What's happening is that the output from delayme.pl is getting buffered on the way to its parent. If you leave it as it is but make the loop longer, you'll get a bunch of lines all at once, and and then another long pause while more lines build up in the buffer.
When it comes to bidirectional communication, you will eventually want to look into IPC::Open3 or IPC::Run for that. I've used Expect in the past too.