Sure, you can write a program which tries one thing and another in some
brute-force way.
There's nothing to prevent people from writing such a program in Maxima
except for
the two items you already mentioned.
1. You will probably end up with a brute force method which could take
a long time to run on exactly the kinds of expressions for which it
matters: large ones.
I am assuming that you need to partition subexpressions e.g.
a+b+c+d+e...+z --> simplify(a+c+d+..) + simplify(b+e+ ...) + ...
Or do other combinatorial rearrangements. If you just call ratsimp()
or factor() or radcan(), then that's not cheap either, but it is not as
effective.
(e.g. factorsum).
2. You need to have some way of terminating the search, or deciding
which possible result is best.
You could give hints, like functions to include in the answer, functions
to exclude from the answer, how to evaluate complexity, assumptions to use.
Mathematica and Maple do things like this. Check their documentation.
Your draft of a simplify program looks like a good start.
RJF