The pertinent characteristic of a symbol like \[FormalX] is that it has the attribute Protected (by default). A protected symbol cannot be given new definitions (you might have noticed code that protects important symbols after giving them some definitions). So, if you're creating a package intended for others to use, it's a fairly safe assumption that you won't get name conflicts if you use formal symbols. It's not guaranteed, of course. Additionally, formal symbols come with no default definition, so if you just want to use something as a literal indeterminate type of symbol, a formal symbol is a good choice--you get no name conflicts and it will display as itself.
Now, let's say you're building a package and you have some symbols/variables that are being used as parameters or package-specific constants or just have some usage internal to your package. In that case you don't care about the display aspect, but you still want to avoid naming conflicts. In such a case you'd probably use the Context mechanism. You might have a variable like MyPackage'Private'MyFancyParameter.
[NOTE: The single quotes used in that variable name are used because backtick is a formatting syntax on this site. In Mathematica code you'd use backticks.]