The examples you list like sharing rules and Organisation-Wide-Defaults are all just ways of managing sharing declaratively (e.g. without code). There are different layers to this as you can control access at an object-level, at a field-level and at a record-level.
Apex Managed Sharing allows you to create more sophisticated sharing rules than the declarative tools allow. Crucially these can be dynamic. For example, you can used Apex Managed Sharing to write a trigger that will share a record with a user specified in a lookup field (this example comes from the docs).
with sharing keyword simply ensures that the class takes into account the sharing rules for the current user. This overrides the default position where Apex is set to run in System context which automatically has access to all objects, records and fields.
In summary, Apex Managed Sharing is about programmatically configuring sharing rules whereas
with sharing is about enforcing existing sharing rules for the Apex class.