The CPS instruction causes confusion for a lot of people and probably results in it being overused because its purpose is misunderstood. The instruction help in RSLogix5000 is actually pretty good at explaining the differences and when you should use CPS over COP.
In general, instructions in the same program execute one at a time in a specific order. So if you have 2 CPS instructions in the same program, the first one will always execute to completion before the second one starts. The same is true for a COP instruction. The difference for the CPS instruction is that once it starts executing, interrupts are disabled. This is useful if the source or destination data is I/O data and a partial write may cause the data to be misinterpreted by the receiver. Therefore, you mainly need CPS if the source or destination is I/O data, produce/consume data, or data that a task with a higher priority can also write to. To clarify, the reason I/O data and produce/consume data carry this risk is that they are inherently updated asynchronously to the program execution. If you buffer your I/O, this is probably not an issue.
For most tasks, a regular COP will work just fine. So what's wrong with always using CPS just to be safe? It's the "disables interrupts" part. For instance, if you have a task that needs a very stable time base (PID loops) and you give it a period of 100ms and a priority of 1 so that nothing will interrupt it. You may think that your task should execute perfectly. However, if your program uses CPS heavily, it can cause jitter in the execution time of your priority 1 task by delaying its start time.