I'm not sure there is one best way, its usually personal preference and depends on the kind of model you are working on.
For me, I've found I prefer working in low poly, and use an iteration or 2 of subdivision, making sure to control surface edges with smoothing groups. This helps me keep really clean and consistent poly flow across the whole car.
Only once I'm truly happy that my car is as close as I can get in terms of proportion and shape do I then move on and manually chamfer hard edges, split into panels/windows/other features etc, and of course clean up any unnecessary edges.
Nothing worse than spending a lot of time on detail work early on only to realise the overall shape is wrong - that is much harder to fix than if you work very loose in the beginning imo.
Not really the best example, as its quite old for me and I didn't make use of smoothing groups on the low poly subdivided model to get hard edges, but should give a reasonable idea:
This is the very rough low poly model with subdivision on - very easy to change shape if need be whilst maintaining a smooth appearance. Quite a few areas with either ugly poly flow or even actual gaps, but those are easy to fix later on manually.
View attachment 283761
Then this is the same car after some cleanup and details added manually - this way each panel flows really well from one to another, helping avoid bad reflections ingame etc.
View attachment 283760
And just the same again but without the wireframe, to help see the surfaces
View attachment 283762