Function that detects repetitions

list = {{"name1", 4}, {"name2", 5.4}, {"name7", 4}, {"name9", -3}, {"name11", 4},
     {"name6", -3}, {"name15", 4.1}};

You can also use Counts and Cases:

counts = Counts[list[[All, 2]]];
Cases[{a_, _?(counts[#] > 1 &)} :> a] @ list

{"name1", "name7", "name9", "name11", "name6"}

And an alternative way to use GatherBy + Select combination:

list[[Join @@ 
  Select[Length @ # > 1 &] @
    GatherBy[Range @ Length @ list, list[[#, 2]] &], 1]]

{"name1", "name7", "name11", "name9", "name6"}


Applying GroupBy to your test list:

GroupBy[testlist, Last -> First]

<|4 -> {"name1", "name7", "name11"}, 5.4 -> {"name2"}, -3 -> {"name9", "name6"}, 4.1 -> {"name15"}|>

It remains to select values with the length larger than one. This can be done, for example like this:

func2[l_] := Flatten[Values[Select[GroupBy[l, Last->First], (Length[#]>1)&]]]

func2[testlist]

{"name1", "name7", "name11", "name9", "name6"}

Same concept as a composition of functions:

func = Flatten@*Values@*Select[GreaterThan[1]@*Length]@*GroupBy[Last->First]

Here's one way to solve your problem. First, let

list1 = {{"name1",4},{"name2",5.4},{"name7",4},{"name9",-3},{"name11",4},
         {"name6",-3},{"name15",4.1}};

then

Sort[Transpose[Catenate[Select[GatherBy[list1, Last], Length[#] > 1 &]]][[1]]]

I don't know if that is efficient enough for you, but will be interested to see how it compares with other proposed solutions.