It depends on which arm architecture you are talking about and which instructions. The branch link (BL) and branch link exchange (BLX) instructions have the link register r14 hardcoded such that the pc of the return address is written there.
The return instructions bx lr, mov pc,lr, the software chooses lr as the return it is not hardwired like other instruction sets.
A programmer or compiler is free to not use the bl instruction and can use the stack, but it makes more sense to just use these instructions as intended.
As far as interrupts and local variables and saving state on a function call. the software has to save state on a function, call the hardware does not do that for you. Saving state on an interrupt, that depends on the architecture. for the traditional 32 bit arm you had/have banked regitsters, and when you switched modes some or many of your registers swtiched to another bank, for example there were a number of r13 registers, one for user mode, one for irq, and so on, such that you didnt have to use different instructions the registers you were using switched out from under you, so in that respect when you went from user or service mode to irq mode, that basically protected or saved state by switching yo away from that bank of registers, any more state you wanted to save you needed to do yourself.
Now the cortex-m microcontrollers are a little different, when an interrupt occurs, the hardware saves state for you, all the registers, there is no banking of registers, it simply pushes them on the stack and uses a bit pattern for the return address to indicate this was an interrupt and to restore the registers/state.
All of these things are documented either in the Architectural Reference Manual for an arm architecture or in the Technical Reference Manual for the specific core. both sets of documents are found at infocenter.arm.com
The arm cores vary as to how interrupts are handled, traditionally you had individual irq and fiq lines coming in. ARM makes cores not chips, so it was up to the chip vendor to implement the rest of the interrupt design, and it varies widely. In general though you (software) have some responsibility to go to the peripheral and tell it to deassert the interrupt from its end. How it is latched between the peripheral and the core is part of the stuff that can vary. Basically you want to have the signal deasserted before leaving the service routine. the cortex-ms and newer full sized cores can have dozens to hundreds of individual interrupts supported making softwares job easier and performance better you dont have to spend time in one universal isr figuring out who caused it then branching off to various handlers, they take it to the other extreme of each peripheral or even finer grained than that can have its own isr.
Some cores more of the interrupt management is in the core and you see the arm docs for that, the rest of the interrupt management is specific to that chip and you need the docs from the chip vendor for that information, there is in no way a universal answer for how interrupts work.