I have a general question about best practice in OO Delphi. Currently, I put try-finally blocks anywhere I create an object to free that object after usage (to avoid memory leak
It's definitely best practice to use try-finally.
In the event of an exception being raised, that object will be freed.
As for performance: measure before you optimise.