On question 1: see Plus and negative side of an internal facet, which was posted at a similar time as your message.
On question 2: dolfinx-mpc seems the way to go, unless you want to use something like what was discussed in the last sentence of Locating the inflow boundary - #6 by hherlyng
On question 3: you could manually throw away rows/cols and create a new matrix, as done for instance in dolfiny/dolfiny/restriction.py at master · michalhabera/dolfiny · GitHub . multiphenicsx directly allocates a matrix of the right dimension, rather than allocating a bigger one and throwing away extra rows/cols.