Your code does not give a useful error message should chdir fail. Include $! in die.
There is no need to interpolate $dir in constructing @args. There is also no need to use interpolating quotes on a constant string. my @args=($dir,'&') is sufficient.
The temporary @args array is not needed, use system($dir,'&').
The "&" is passed as a literal argument to program2.pl. If you want THE SHELL to put program2.pl in background, you need to invoke the shell by calling system with a single string argument. That causes a lot of trouble, starting with the need to use proper quoting for an unknown shell that can require different quoting on different systems. So, your chances to invoke "the" shell with proper quoting are quite low, and thus, you open a big security hole.
To create a background process, use fork() and exec() as explained in the perl documentation. On Windows, use system(1,...).
Alexander
--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)