LWC can only invoke static Apex methods, via @wire and imperative calls. There's no instantiation of a "controller" - indeed, there is no "controller" for the LWC, just a (possibly distributed, possibly in one class) set of @AuraEnabled static methods for the LWC to invoke.
Wires are invoked shortly after component instantiation though this is delayed based on any parameters - the wire is invoked once all parameters have defined values. Imperatives are explicitly called from functions in your LWC.
The LWC doesn't rely on state "on the server side" and so must maintain and explicitly pass all required details to each wire or imperative call.
This is covered quite well in the documentation. Note also the "lifecycle hooks". You can also undertake the trailheads to find out more.
If you have code that you wish to share between a Visualforce page and an LWC you will need to refactor the code so it can be called through, or as, an @AuraEnabled static method and from your Visualforce controller.
Also understand that there is no automatically maintained "page state" shared between client and server in LWC (unlike Visualforce). Instead any state must be explicitly passed as parameters to the apex method, and explicitly updated on the client side on receipt of the responses from these calls. This makes for much more responsive pages.