There are other factors/options too. You could use batch/scheduled Apex to send groups of records. Depending on the volume of records and the number of changes, this might be more efficient.
I've successfully used the workflow method. You can choose some details about what gets sent by the workflow callout, and it requires no coding on the SF side, which can make it good. Although it is harder to debug because the SF side is pretty much a black box to you.
And I've successfully done this using Apex fired from a trigger (asynchronously - you cannot just call out from a trigger).
And I've done the scheduled sort of thing too.
I haven't used Process Builder for this - I'm not sure that I would. It does have weird pitfalls, and workflows can get the job done.
I would say that:
If you're not that familiar with Apex coding, but you are happy to do the work in the external system, workflows make a lot of sense.
If you're happy with Apex coding (and can live with the callouts happening minutes after the record change), the scheduled/batch callouts is a pretty good option.
It's a fairly complex Apex task to fire asynchronous callouts from a trigger with all the appropriate error handling to make it reliable. It's probably the "best" but it is definitely the most effort.
Personally, I'd go with last of those options, but that's because I wrote a framework to make it easy to manage firing callouts from triggers :)
PS, the workflow's endpoint cannot (as far as I know) come from a custom setting. But it is just a field in the workflow that you can change later, so it's not difficult to update.