I spoke with Rockwell tech support and was told that there really aren't any differences between the MSG instruction and Produced/Consumed tags (that's it's personal choice);
That's not good advice coming from RA - There are lots of differences, and knowing those differences will sway your choice as to what you use for each circumstance. Many projects use both P/C and Nessaging side by side....
It's a case of "horses for courses"....
Produced/Consumed tags can only go up to 500 bytes of data - that's 125 DINTs or REALs, 250 INTs, or 500 SINTs (although if it's ControlLogix to ControlLogix you'll be using DINTs for efficient usage at either end). If your data size is smaller, then it's an advantage to use UDTs to compact data into single larger tags. That will reduce the number of "connections" you consume.
Produced/Consumed tags will be transferred continuously, irrespective if the data has changed or not.
Produced/Consumed tags continue to work if either, or both, controllers are in program mode. You can add a "Connection_Status" tag to detect the other party is running, and the connection is valid.
Data change can trigger an Event Task in the consumer.
Messaged tags can be any size, although transported in 500 byte packets, they report .DN when the whole message has been transferred.
Messages can use a "temporary" connection, which is released after the message is completed, allowing the connection to be re-used.
You can trigger the message at any time you like, there's no justification in sending the same data values repeatedly, and you can elect to send the data at much less frequent intervals, or at specific times, or when a particular event occurs, for example...
You would have to set up some form of "handshaking" to detect that the controller you are reading from and writing to is in Run Mode.
Data change in a messaged tag can't trigger an event task, you would have to write code to detect changes in data.
.... another programmer told me that the produced/consumed tags are a more efficient way to communicate; they use less bandwidth, no queue headaches, and are a lot faster.
Produced/Consumed tags will use more bandwidth than a slower running message instruction.
Message instructions that are not continuously re-triggered generally don't cause queue headaches.
"Faster" needs qualifying, sure, P/C is deterministic, and goes at the RPI rate specified.
In summary, you use whichever method is best for your application.