Hay varios quids a los que atender...
De entrada el bucle priuncipal no está óptimamente planteado.
Verás si haces un bucle 'Mientras X', es una redundancia inútil, preguntar acto seguido lo mismo Si x luego...
Piensa en un condicional como un bucle de un solo ciclo, si se cumple se entra y se ejecuta 1 vez y si no, no... un bucle persé es lo mismo, solo que permite entrar muchas más veces retornando al origen.
Tu bucle debiera se rmejor así:
texto = sc.nextLine();
Si (!texto.equals("FIN")) luego
Hacer
... todo el trabajo que realizas
texto = sc.nextLine();
Repetir mientras (!texto.equals("FIN"))
Fin si
Y aún más ióptimo cuando un lenguaje admite en el bucle condcionarlo al comienzo:
texto = sc.nextLine();
Hacer mientras (!texto.equals("FIN"))
... todo el trabajo que realizas
texto = sc.nextLine();
Repetir
Luego, llamas múkltiples veces desde dentro del bucle a un rutina externa a la propia donde yace el bucle, cada llamada externa a otra función es una sobrecarga porque exige depositar en la pila el estado actual en dicha función, antes de llamar a la función (cifrar) y a su vez tras la llamada, volver a restablecer el estado en dicha función sacando los datos de la pila... y esto se hace por cada letra...
ergo... mete ese código dentro del bucle, no en una función aparte. Sólo con eso ganarás en velocidad.
Por último, aunque tu función "cifrar" es clara, no es nada óptima, esto no debe resolverse invocando a una función, desde el momento en que F=X, es deicr en que hay una asignación directa, lo correcto es meterlo en un array, ya que no requiere un cálculo complejo tal que con la misma entrada pudiera dar lugar a diferentes salidas...
Ergo genera una array, al inicio de tu aplicación donde se establezca la igualdad d ela asignación:
Array(0) = 65 /A
Array(1)= 66 /B
Array(2)= 67 /C
...
Array(25) = 90 //Z
Array(26) = 65 //A
Y ahora en tu código simplemente codificas para redirigir un valor a un índice correcto. Tu array podría llamarse Cifrar (para más inri)
CadenaSalida += Cifrar(ValorASCII(Texto.CharEn(I))-65+dpz)
Esto es: debe tomarse el valor ASCII del caracter obtenido en: Texto.charEn(i)
Como "A", es el carácter 65º y nuestro array comienza en 0, le restamos 65 y como estmaos haciendo una codificación césar, el dpz, suma el valor a desplazar en este caso dpz=1, si en vez de 1, usas dpz la misma función te vale para codificar con diferentes valores.
Más eficaz aún sería si el array en vez de asignarse la "A" en el índice 0, se asignara en el propio indice 65, así se evitaría también la resta de -65 para cada carácter.
Así al inciio crea un array estático así:
Bucle para k desde 0 a 255
ArrayCifrado(k) = k
Fin bucle
Que es una tabla ASCII, es decir cada índice contiene el código de cáracter de la tabla ASCII, ArrayCifrado(65) = 65, qeu es el código de la letra "A".
Todavía queda ajustar cuando excede la suma del desplazamiento. en el previo yo he provisto un índice 26 par ala "A" cuando la letra a codfificar fuera la "Z", pero si el desplazamiento fuera mayor de 1, necesitaría un indice 27 y contener la "B", etc... mejor que eso es ver si el ídnice supera el límite y en tal caso 'modular'...
indice = ASCII(Texto.CharEn(i)) + dpz
Si indice> 90 luego
indice = ((indice modulo 90) + 65)
Fin si
Cadenasalida += CharFromASCII(ArrayCifrado(indice)) //CVharFromASCII, sería la función opuesta a ASCII, es decir le das un código ASCII y te devuelve el carácter correspondiente.
Y por último tu código peca de ineficiencia en la concatenación de la cadena que vas generando...
CadenaSalida += ...
Cada vez que concatenas un carácter o un texto a otro, requiere construir otra cadena del tamaño adecuado (del tamaño exacto que se reclama tendrá), y copiar allí el texto original y luego el otro que se concatena, y luego destruir la cadena previa, esto es, supone buscar espacio libre en la memoria, reservarlo, copiar y luego apuntar la dirección de esa memoria a la variable cuyo nombre se usa...
El modo óptimo es que si se puede precalcular el tamaño que tendrá el texto al final, se genere de una sola vez una cadena de texto de ese tamaño (aunque sea repleto de espacios) y luego en vez de concatenar se va alterando el contenido del carácter en la posición x...
Con todos estos consejos llevados a cabo, ten por seguro que incluso vas a superar los valores que tu señalas como más rápidos que el tuyo...