Can we try to make it a little bit more hacky?
Set the opacity for the whole `<li>` element, then use the `:after` layer to set it below the `<li>` with a `z-index: -1;` to set the `background` `borders` or what ever we want to keep solid.
Anyway if this goes too much hacky, i really suggest to apply opacity also to the borders even knowing it is a UX request but the performance impact will be huge in applications as contacts or email :S