New better version:
It uses my algorithm in Update section of my question here.
It checks whether removing particular pair of parentheses changes value of expression, if not then the pair of parenthesis is removed.
fu[s_] := Module[{ps = Flatten[StringPosition[s, #] & /@ StringCases[s, "(" ~~ Shortest[x___] ~~ ")" /; StringCount[x, "("] == StringCount[x, ")"], Infinity, Overlaps -> True], 1], sps}, sps = Select[ps, ToExpression@ StringReplacePart[s, "", {{#[[1]], #[[1]]}, {#[[2]], #[[2]]}}] == ToExpression[s] &]; StringReplacePart[s, "", Flatten[{{#[[1]], #[[1]]}, {#[[2]], #[[2]]}} & /@ sps, 1]] ] s1 = "(((((((1*2)-3)+4)+5)+6)-7)+8)+9"; s2 = "(((((((1*2)+3)-4)+5)/6)*7)+8)+9"; s3 = "(((1+2)-((3*4)*5))+(6*(7+8)))-9"; fu /@ {s1, s2, s3}
{"1*2-3+4+5+6-7+8+9", "(1*2+3-4+5)/6*7+8+9", "1+2-3*4*5+6*(7+8)-9"}
Old version:
This works for the three examples (although the second example can have one less parenthesis but OP has the same one redundant parenthesis):
s1 = "(((((((1*2)-3)+4)+5)+6)-7)+8)+9"; s2 = "(((((((1*2)+3)-4)+5)/6)*7)+8)+9"; s3 = "(((1+2)-((3*4)*5))+(6*(7+8)))-9"; (Hold[ToExpression[s1, InputForm, Hold] /. x_Integer :> xx[x] // ReleaseHold // Evaluate] /. xx[x_] -> x) // ToString[#, InputForm] & // StringTake[#, {6, -2}] & ToExpression@% == ToExpression@s1 (Hold[ToExpression[s2, InputForm, Hold] /. x_Integer :> xx[x] // ReleaseHold // Evaluate] /. xx[x_] -> x) // ToString[#, InputForm] & // StringTake[#, {6, -2}] & ToExpression@% == ToExpression@s2 (Hold[ToExpression[s3, InputForm, Hold] /. x_Integer :> xx[x] // ReleaseHold // Evaluate] /. xx[x_] -> x) // ToString[#, InputForm] & // StringTake[#, {6, -2}] & ToExpression@% == ToExpression@s3
"-7 - 3 + 1*2 + 4 + 5 + 6 + 8 + 9" True "((-4 + 1*2 + 3 + 5)*7)/6 + 8 + 9" True "-9 + 1 + 2 - 3*4*5 + 6*(7 + 8)" True