The interesting part is that LEDs aren't switching on now. I find out that they do when I comment 4th line which is weird, because it is declaring this channel as an input mode, in a reset state, it's declared as an output.

Additionally, I take TIM3->CNT on watch when debugging and it's counting properly.

Most of the times when you assign a value to a register in your code (example: TIM3->CR1 = TIM_CR1_CEN;) you really should use read-write approach to change only the bits you mean to (example: TIM3->CR1 |= TIM_CR1_CEN;).

If you are determined to use direct register programming approach instead of using HAL or LL then you can download one of the STM32Snippets packages and see the Timer examples there. STM32Snippets currently exists only for STM32F0 and STM32L0 families which are different than STM32F3 in many things, but the Timers are very much the same, so the TIMERS/03_InputCaptureOnTI1 example project should help you.