Da liegst du falsch:
\documentclass{article}
\usepackage[a4paper, left = 2.5cm, right = 2.5 cm, top = 2.5 cm, bottom = 2.0 cm,showframe]{geometry}
\usepackage{blindtext}
\usepackage{xcolor,picture,eso-pic}
\AddToShipoutPicture{%
\AtPageUpperLeft{%
\color{red}%
\put(0,-2.5cm){\vector(1,0){2.5cm}}%
\put(2.5cm,0){\vector(0,-1){2.5cm}}
}%
\AtPageLowerLeft{%
\color{red}%
\put(0,2cm){\vector(1,0){2.5cm}}%
\put(2.5cm,0){\vector(0,1){2cm}}%
}%
}
\pagestyle{empty}
\begin{document}
\Blindtext
\vfill
\Blindtext
\end{document}
Der vertikale Pfeil oben ist genau die durch top eingestellten 2,5cm lang, der unten genau die durch bottom eingestellten 2cm. Die durch Option showframe erzeugten Rahmen zeigen u. a. genau die Größe und Position des Textbereichs.
Sollte das im Ausdruck bei dir nicht so sein:
https://komascript.de/faqtreibermist.
Natürlich ergibt sich das Problem, dass in in deinem Fall schlicht keine ganze Zahl an Zeilen in den Textbereich passen, deshalb ist, wenn man das \vfill auskommentiert, die letzte Zeile nicht mehr am unteren Rand des Textbereichs, sondern ca. eine halbe Zeile höher.