Bueno, para empezar, dejame comentarte algo, en programacion no existe una "unica" solucion correcta (eso es lo bonito de la programacion), todo problema puede tener infinidad de soluciones, todas correctas, todo dependera al final de factores como el lenguaje de programacion que utilizas, el conocimiento y experiencia del programador, y de los recursos con que cuentes para resolver el problema.
Asi que contestando tu pregunta:
¿es muy distinto hacer lo mismo con un bucle foreach para sumar 2 vectores y poner el resultado en otro?
Al final seria lo mismo, solo que resuelto de una manera diferente, pero eso no quiere decir que este equivocado.
Entonces, la sobrecarga de operadores es simplemente una herramienta mas a nuestra disposicion para resolver un problema.
Te pongo un ejemplo, supon que necesito calcular la operacion de multiplicar un vector por un escalar, como piensas que seria mas entendible para hacerlo, desarrollar una funcion que te multiplique un vector por un escalar asi:
MultiplicaVectorEscalar(Vector, 5);
o realizar una sobrecarga del operador * para realizar la multiplicacion de esta manera:
Vector * 5;
Otro ejemplo, queremos realizar una clase para el manejo de los numeros complejos, y a su vez queremos realizar todas las operaciones basicas (suma, resta, multiplicacion, division) con numeros complejos de la misma manera que lo hacemos con los numeros reales. podemos definir todo mediante funciones/metodos:
Suma(Complejo1, Complejo2), Resta(Complejo1, Complejo1) Multiplica(Complejo1, Complejo2), Divide(Complejo1, Complejo2).
o podemos sobrecargar los operadores y el codigo queda mas "elegante"
Complejo1 + Complejo2, Complejo1 - Complejo2, Complejo * Complejo2, Complejo1 / Complejo2.
Como nota personal, yo no uso mucho la sobrecarga de operadores, pero se como se hace, asi por ejemplo si me encuentro un programa que la utiliza, se lo que esta haciendo y como se utiliza, que al final es lo que importa.
Saludos