Your pattern of /[a-zA-Z0-9~!@#$%&_-.!\?\,\' ]$/ could be simplified:
/^[a-z0-9~!@#$%^&*_.!?,'\s-]*$/i
Using the 'i' modifier makes things case insensitive (which eliminates the need to list both upper and lowercase characters). Since you are using double quotes for your pattern (personally, I prefer single quotes), the single quote within the class in this case doesn't need escaping (nor does characters like . ! ? ,) as most meta characters lose their special meaning inside a class. Some characters might retain this status depending on their location within the class, such as the dash. This character doesn't need escaping on the condition that it is the very first or very last character listed within the character class.
If enforcing the character class shorthand \w to be strictly equal to a-zA-Z0-9_, we can use setlocale() and shorten the pattern even more:
setlocale(LC_CTYPE, 'C');
preg_match("/^[\w~!@#$%^&*.!?,'\s-]*$/", $value_of_field);
Performance gains / hindrances is probably debatable (as is regex pattern readability). There's nothing wrong with (unecessarily) escaping certain characters or listing a range of characters instead of using shorthand character classes (like \s or \w). Just adds clutter to the pattern imo (but this is all subjective I'd wager). To each his/her own?