The git remote command is meant for manipulating (working with, adding, and removing) remotes.  It has ten (!) sub-commands:
- git remote add
- git remote rename
- git remote remove
- git remote set-branches
- git remote set-head
- git remote get-url
- git remote set-url
- git remote show
- git remote prune
- git remote update
Each sub-command may have its own sub-sub-commands or options; and if run with no sub-commands at all, git remote simply lists all remotes.
For whatever reason, you are asking about only two of the ten sub-commands: add and set-url.  This may be because you are not sure what a remote is in the first place.  The short answer is that a remote is just a name, but it's a name that is used to keep track of another Git repository, at some other URL.
While origin is a pretty standard remote name, it's not the only possible remote name—and your own repository may have no remote, in which case origin is not the name of one of your remotes, since you have none.
Still, many if not most repositories have exactly one remote, because so many are created by git clone.  The git clone command automatically creates one remote, which it names origin unless you tell it to use some other name.  So most repositories already have a name origin.
git remote add
What git remote add is for is to add a new remote.  If you have one remote now, and you add another, you will then have two remotes.  If you have none, and add one, you will have one.
Again, the point of a remote is to name another Git repository, and that other Git repository is going to be found at some URL.  Hence, to make a remote useful, it needs a URL.  So git remote add takes two arguments: the name of the new remote to add, and the URL to associate with that name.
(This omits a lot of the fancier special things you can do with remotes.  I've never found some of them useful myself, but they are the reason that there are a bunch of option flags to git remote add.)
git remote set-url
What git remote set-url is for is, mainly, to change the URL associated with some existing remote.  Hence it takes the name of an existing remote, and a new URL.  The default action is to remove the old URL and insert the new one instead.
Git tries not to limit you to a single URL here: it allows more than one URL to be attached to each named remote.  Precisely what happens when there are multiple URLs for any one remote is a bit tricky; it's best not to do this until you are comfortable with single-URL remotes.
git config
The git config command is a much lower level thing.  Most of the settings you can make or change in Git are ultimately done through configuration entries, and this includes adding or deleting remotes and changing the URLs associated with any one particular remote.  What this means is that the higher level git remote command often translates into one or more low-level git config operations.  If you know precisely which configuration entries control which remote(s) in which ways, you can use git config to achieve some of the same things that git remote does.
Some of the things git remote can do are not merely configuration settings, so not everything is translatable like this.  But adding or deleting a remote, and changing its URLs, are, and therefore can be.
Adding a new remote essentially consists of running two git config commands.  If the name of the remote is R, the two configuration items are remote.R.url and remote.R.fetch.  Setting the first without setting the second is not a great idea in general, and you need to know what to set the second to, so it's safer to use git remote to add a new remote.
Changing the (single) URL for an existing remote consists of running just one git config command.  For remote R, that's git config remote.R.url new-url (--local is the default for git config so you may omit it).  The URL does not affect the fetch value, so it is safe (albeit a bit pointless) to use git config to do this instead of using git remote to do it.  If there is more than one URL attached to some particular remote name, though, git remote adds safety checks that git config totally bypasses.