Your regex %20(%20)? matches a %20 and then 1 or 0 (an optional) %20 substring.
To match zero or more, you need to use * quantifier - %20(%20)*. However, this is equal to (%20)+ since + matches 1 or more occurrences of the quantified subpattern.
You can also use a non-regex approach with split and join.
See C# demo
var s = "The%20%20%20%20%20%20%20%20%20%20Park";
var regex = new Regex("(%20)+", RegexOptions.ExplicitCapture);
var output = regex.Replace(s, "-");
Console.WriteLine(output); // => The-Park
output = string.Join("-", s.Split(new[] {"%20"}, StringSplitOptions.RemoveEmptyEntries));
Console.WriteLine(output); // => The-Park
Note that it is a good idea to use RegexOptions.ExplicitCapture if you do not want capturing groups (pairs of unescaped (...)) in your pattern to create a stack for keeping captured values (just to steamline matching a bit).
"%20(%20)?"->"%20(%20)*"->"(%20)+"