The previous poster was correct that the exec'ed application will do its own buffering, since its output has been redirected to a file (output to the terminal is just line-buffered, usually). If you have the source for that app, you could just flush after each line you print.
Another approach would be to start the app using Expect.pm, which tricks apps you spawn into thinking they're talking to a terminal.