Perhaps a little "simpler", and a little quicker for smallish lists (it will blow up time-wise as list lengths grow, as does the OP method,) :
With[{i = Intersection @@@ Subsets[#[[All, 2]], {2}]}, {Union @@
Pick[Subsets[#[[All, 1]], {2}], # != {} & /@ i], Union @@ i}] &@l
I'll throw this done while lounging quickie into the ring. It assumes the constraints I asked about in the comments hold (sublist values are positive integers) though if that's not the case it could be easily adapted to handle it. Not simpler, but certainly faster as list size grows.
intersectionInfo=
Module[{s = SparseArray[Join @@ Thread /@ Transpose[{Range@Length@#, #[[All, 2]]}] -> 1],
vals, lbls},
vals = Pick[Range@Max@#[[All, 2]], UnitStep[Subtract[Total[s], 2]], 1];
lbls = #[[All, 1]][[Pick[Range@Length@s, Unitize[Total /@ s[[All, vals]]], 1]]];
{lbls, vals}] &;
(* use your example l *)
intersectionInfo@l
(* {{"label1", "label2", "label3", "lable5"}, {3, 4, 5}} *)
A quick run using a 5000 length list generated with
len = 5000;
l = Range@len;
subs = DeleteDuplicates /@ RandomInteger[{1, 10000}, {len, 5}];
l = Transpose[{l, subs}];
shows about a 700:1 performance advantage (grows as list size grows). N.B.: I used integer labels for convenience in the test, should have no material effect on timing differences.