It is a huge challenge in LabVIEW. It is often overlooked by beginners which causes lots of problems.
I often just have a common folder on disk full of typedefs.
I have tried to use more generic types as much as possible when transferring data across module boundaries. If I can I pass some native datatype like a map, set or array. For a waveform, why not just a simple native waveform? If you have metadata, IIRC waveforms accept metadata just like variants do.
Occassionally, I'll even pass a simple cluster without making it a typedef. ie. an x-y point is just a cluster of 2 doubles. No real need to make that a typedef. Of course as soon as it gets any more complicated, then you probably need a typedef.
I've also given a lot of thought to using JSON to pass data between modules, but haven't quite worked that out yet.