(This question should be migrated to unix as it's not raspberrypi specific)
- Zero free space on the running system (there are a few ways but zerofree is a simple one)
- Make the .img
- Compress with 7z (zip and rar also work but 7z as they can use 7z's open LZMA2 compression).
- Using backup software will store only the differences in each backup (more effectively without step #3)
You can further reduce .img size by clearing logs, caches, unused packages etc.
As a system backup solution it is often best to keep an install.log you can run (or follow) on a fresh install as you will want to upgrade, or use a different distribution and guessing what you did and why from a backup image is not worth the effort.
If you are backing up data and not the OS then backup software has numerous advantages.