I have come across the following type of code many a times, and I wonder if this is a good practice (from Performance perspective) or not:
try
{
    ... // s         
        
The throw in your first example has the overhead of the creation of a new CustomException object.
The re-throw in your second example will throw an exception of type Exception.
The re-throw in your third example will throw an exception of the same type that was thrown by your "some code".
So the second and third examples use less resources.