The reason for the dd to write zeros all over the CF card is quite simple and quite complex all at once.
Most filesystems on a computer, don’t actually delete a file when you tell them to, they remove the pointers so that the system doesn’t know that the file is there any more, they mark the blocks as available and thats it - the actual data is still there (this is why file recovery software works… well so long as the blocks have not been over written…).
So when you use dd to take an image of the card - it does so at the block level, including all the crap you have written before and deleted again (or changed jn the case of anything that ever changed ever…).
When you compress the image - you also retain and compress all of the garbage with it, but its toast - we don’t need that, and this is where writing zeros all over the card comes in…
so now we make a giant file, full of zeros to deliberately fill up the CF card (with zeros) and then delete it (leaving those zeros behind remember…).
now when you take the image of the card, those zero’s are still copied (because its a block level copy) BUT, when you come to zip (compress) the image ready for deployment, zeros compress to nothing - where miscellaneous binary crap - doesn’t.
I hope thats a good enough explination - if not please say so and I’ll see if I can help you understand whatever you didn’t quite get.