Subroutines are not that nice for this particular problem. Nonrecursive solution would be more readable. You tried to use subroutine as a function. You cannot do that, they are very different. You must use them only in the call
statement and only one at a time. If you want some result, you must use an argument for that.
RECURSIVE SUBROUTINE fibonacci(n,fibo)
IMPLICIT NONE
INTEGER, INTENT(IN) :: n
INTEGER, INTENT(OUT) :: fibo
INTEGER :: tmp
IF (n <= 2) THEN
fibo = 1
ELSE
CALL fibonacci(n-1,fibo)
CALL fibonacci(n-2,tmp)
fibo = fibo + tmp
END IF
END SUBROUTINE fibonacci
call fibonacci(5,i)
print *, i
end