Il y a le coté redimensionnement à faire pour avoir des images de tailles homogènes.
Puis lorsque finalement tu enregistre ton fichier image :
bool imagejpeg ( resource image [, string filename [, int quality]])
Comme tu vois, la fonction imagejpeg te permet de préciser la qualité du fichier. Donc une solution c'est de générer le fichier avec une qualité de 100 % puis de réduire de 10 en 10 jusqu'à obtenir le poids souhaité.
En faisant des essais de redimensionnement, tu va t'appercevoir que pour une certaine taille (mettons 500 x 500) et pour une qualité (ex 80) tu va obtenir des poids de fichier du même ordre.
Je fais la même chose sur un site :
photos largeur max : 600 px hauteur max : 450 px qualité : 40 à l'arrivée mes photos font moins de 25 Ko.