Craft Commerce returned orders stock and refund handling
Update:

Commerce 2 now supports partial refunds for payment gateways that support partial refunds.



Partial refunds on Commerce is definitely on our radar... it's the 8th most requested feature here: https://github.com/craftcms/commerce/issues

Unfortunately, it's pretty impractical right now in Commerce 1 with our reliance on the Omnipay  ibrary for all of our payment gateways. They support the "lowest common denominator" and since many of the gateways they support don't support partial refunds, they don't support it at all.

The upcoming Commerce 2 makes Onmipay an optional requirement... meaning that it's much easier to write a plugin for an arbitrary gateway and add support for the ones that support partial refunds.  For example, the 1st party Commerce 2 Stripe plugin implements it and can be used as an example for other payment gateway plugis.

None of that doesn't help you now, though. You can always do a partial refund directly with the gateway if they support it (Stripe, Sagepay, etc.), but the downside is that won't sync back to Commerce 1 so order totals/inventory/etc. won't be updated on our end.

If the payment gateway has callback hooks for that type of thing, you can write a plugin that helps alleviate some of these issues, but none of it is a really clean solution.