UPX also prevents re-using pages when multiple instances of the executable are loaded in RAM which is bad on low end systems.
The best solution would be to use BTRFS/ZFS with transparent compression (can use fast algorithms) or even SquashFS if you can deploy the entire app image mounted in a directory.