Programm blocks are meant to be use to keep the TB executing monitoring tasks in the reactive region preventing race condition between module TB and module DUT.
This can be achieved by using clocking blocks in the interface. Generally speaking the program blocks have more restrictions compared with the module like: modules cannot be declared and extern tasks as well. Since nothing prevents you from calling tasks or so from a module into a program just by passing it as reference from program I believe. So i would recommend you to avoid using program block unless really needed (even if i cannot see use cases, tools not supporting clocking blocks?). Regards