From my understanding, "program tags" are like local variables in a C program. They are restricted to be accessed only from the scope they are declared in, which in this case is a particular program. As far as I know there is no way to access these local variables via the EtherNet/IP interface of the ControlLogix. If you declare them as "controller tags" then they are like globals in C and can be accessed from other programs on the PLC and externally from the PLC, such as via EtherNet/IP.
If you want to access data in local variables from outside of their limited scope, perhaps their scope should not be declared as local to their program. If you are working around existing code, my best guess is that you would have to mirror that data somehow. I'd suggest adding a rung in your ladder logic to mirror whichever variables you need into a controller tag or a data assembly on your LabVIEW system. From a simple experiment I don't think RSLogix5000 lets you simply alias program tags into controller tags (and this would defeat the purpose of limiting their scope in the first place...).
As far as accessing UDTs, hopefully my links above will provide enough details on how to do this, providing you are accessing tags that are set to the right scope.
Your assessment is correct.
I will have to create a duplicate controller tag and extra logic to move the contents of the program tag.
And Merry Christmas to all.