Memory's not your problem with that code. CPU time is. You have a very tight loop that doesn't relinquish control. If you don't need millisecond precision (and if you're not using an RTOS, it's not guaranteed anyway), throw in a
sleep call. You might also appease the style police with a
while loop, but do what you like there.
Memory probably isn't a problem, because Unixy operating systems use copy-on-write techniques when forking a kid. That's why fork is so fast -- the cloned process actually uses the same memory pages as the parent. Only when the kid changes (or writes to) a page is a fresh page allocated. If your hypothetical 50 megabyte program only changes a couple of variables in the kid process, only a couple of pages (probably 4 kilobytes in size on a 32-bit machine) will be unshared.
Of course, you could write a dedicated program to handle events, perhaps with POE or Schedule::Cron, and have it listen on a pipe for events to schedule.