There are two oscillatory parts to your integrand: Exp[-I 1 s] and ig[100, 100 - s, ω, l].
However, because you have defined the function ig for strictly numerical values of its arguments, NIntegrate is not able to "see" its symbolic structure and realize that it is oscillatory with a certain form. Therefore, "LevinRule" can only automatically be applied to the Exp[-I 1 s] part.
You can see what "LevinRule" does:
In[199]:=
NIntegrate`LevinIntegrandReduce[Exp[-I 1 s] ig[100, 100 - s, 2, 1], s]["Rules"]
Out[199]= {"Variables" -> {s}, "AdditiveTerm" -> 0,
"Amplitude" -> {ig[100, 100 - s, 2, 1]}, "Kernel" -> {E^(-I s)},
"DifferentialMatrices" -> {{{-I}}}}
For more information on the LevinIntegrandReduce function, please see this part of the documentation.
However if you define your ig function to allow symbolic evaluation, then NIntegrate can automatically detect the other oscillatory part of your integrand:
In[200]:=
igsymbolic[tau1_, tau2_, ωω_,
ll_] := (((2 ll + 1) ωω)/(4 Pi^2))*
SphericalBesselJ[ll, ωω v g tau1]*
SphericalBesselJ[ll, ωω v g tau2]*
Exp[-I ωω g (tau1 - tau2)];
In[201]:=
NIntegrate`LevinIntegrandReduce[
Exp[-I 1 s] igsymbolic[100, 100 - s, 2, 1], s]["Rules"]
Out[201]= {"Variables" -> {s}, "AdditiveTerm" -> 0,
"Amplitude" -> {(3 SphericalBesselJ[1, 150])/(2 π^2), 0},
"Kernel" -> {E^(-((7 I s)/2)) SphericalBesselJ[1, (3 (100 - s))/2],
E^(-((7 I s)/
2)) (-(SphericalBesselJ[1, (3 (100 - s))/2]/(3 (100 - s))) +
1/2 (SphericalBesselJ[0, (3 (100 - s))/2] -
SphericalBesselJ[2, (3 (100 - s))/2]))},
"DifferentialMatrices" -> {{{-((7 I)/2), -(3/2)}, {(
2 (-2 + 9/4 (100 - s)^2))/(
3 (100 - s)^2), -((7 I)/2) + 2/(100 - s)}}}}
This results in a more efficient integration.
In[217]:=
fsymbolic[ω_, l_, {wp_, pg_, ag_}, mthd_] :=
2 Re[NIntegrate[
Exp[-I 1 s] igsymbolic[100, 100 - s, ω, l], {s, 0, 40},
WorkingPrecision -> wp, AccuracyGoal -> ag, PrecisionGoal -> pg,
Method -> mthd]]
In[218]:= fsymbolic[2, 1, {25, 15, 18}, Automatic] // Timing
Out[218]= {0.343, -1.925723011031919293641188*10^-6}
Scaling up to large values of l is also fast:
In[219]:= fsymbolic[2, 100, {25, 15, 18}, Automatic] // Timing
Out[219]= {0.608, -0.00002319232924789404095060205}
Note that Method -> Automatic is fine here since NIntegrate automatically detects the oscillatory part of the integrand and selects LevinRule.