Another approach for John Doty's example that utilizes less pattern matching could be
Nest[{#[[1]] + 1, #[[2]] + #[[1]]} &, {0, 0}, 10]
Compare these timings
f[{a_, b_}] := {a + 1, b + a}
r1 = Nest[f, {0, 0}, 100000]; // RepeatedTiming // First
r2 = Nest[{#[[1]] + 1, #[[2]] + #[[1]]} &, {0, 0}, 100000]; // RepeatedTiming // First
r1 == r2
(* 0.087 *)
(* 0.0056 *)
(* True *)
Of course, there are better methods for linear recurrences, e.g.,
r3 = MatrixPower[N@{{1, 0, 1}, {1, 1, 0}, {0, 0, 1}}, 100000, {0, 0, 1}][[1 ;; 2]]; // RepeatedTiming // First
r1 == r3
(* 8.39*10^-6 *)
(* True *)