Replace() only allows replacement of a single sequence of one or more characters, so to replace 33 different characters, you'd need 33 nested Replace() functions, each one operating on the resulting value from an inner call. So it won't matter how many stages you use; it will still require 33 Replace() calls.
The 9 capture limit I mentioned above is an MC implementation limit in Regex(), and does not affect Replace(). I mentioned the 9 capture limit of Regex() because the problem you're trying to solve isn't solvable generally using Regex(), but can be solved specifically for cases where there are less than 9 sequences of "<Acceptable Chars><Non-acceptable Chars>". You can think of any Name as a repeating pattern of Acceptable Chars followed immediately by Non-acceptable Chars, again, and again, and again. This could be repeated many times. When the number of repetitions is less than 9, we can formulate an RE that can describe and solve this. So if you're sure you'll have less than 9, we can use Regex().
As I mentioned above, this class of problem is better solved with a global replacement function, because it becomes trivial to do. For example, it could be as simple as:
RegexReplace([Name], /#[^a-z0-9]#/, ;, GLOBAL)
which globally replaces all characters NOT a through z or 0 through 9, with a semicolon.