Nicht benötigte Units entfernen
hilft fast immer.
Eigentlich lässt der Delphi-Compiler alles weg, was nicht verwendet wurde,
aber in vielen Units gibt es einen großen Initialisazionsblock, wo Klassen initialisiert werden, aber damit werden sie auch "benutzt", selbst wenn sie nicht wirklich genutzt werden, aber da sie "benutzt" werden, ist deren Code somit immer im Programm drin, sobald diese
Unit irgendwo eingebunden wurde.
Auch Ressourcen, die in diesen Units eingebunden werden, sind dann immer drin, da man leider nicht angeben kann, dass diese Ressoucen nur gelinkt werden sollen, wenn bestimmte Funktionen/Klassen einkompiliert wurden.
Das mit dem Initialisazionsblock ist die Schuld altmodischer/blöder Programmierer, denn hätten sie die Initialisation z.B. in einen ClassConstructor gelegt, dann wäre alles nur drin, wenn diese Klassen dann "wirklich" benutzt wurden.
Ansonsten sind natürlich solche Profile, wie Debug und Release, genau dafür da.
Eine Konfiguration für die Entwicklung und eine Andere für den normalen Betrieb.