Delphi’s compiler tool chain may automatically eliminate some dead code, but with an older or “mature” product there are bound to be lots of units that are no longer used but are still present as part of a project or referenced indirectly by some other unit. Having a good gatekeeper on your team can help, as can these tools, but it can never replace a team that is concerned about keeping it lean.
For instance, I stumbled across code that was written to compensate for a database column not being a consistent length. That change management issue was addressed a long time ago, yet the code remained, running a very expensive query on Oracle for absolutely no benefit. Some people may not think that is a big deal, but multiply that by 1000 other such things in the main thread of an application and it can start to make Delphi programs look pretty sluggish.
If your team keeps units around because it ‘might’ need them, or older methods because not every call has been replaced, you might want to rethink that. It’s easy to spend time maintaining code that may no longer be relevant. Time means money, and there is no ROI if you are a code hoarder. A VCS makes it easy to restore code in the event you ever need it, or disposed of it by accident.