There are two things going on here:

1. the difference between t-tests and Z-tests (as pointed out by @vkehayas); t-tests account for the uncertainty in the estimate of the standard error, so should be preferred to Z-tests where available.
2. the fact that `summary.lme` by default adjusts the residual standard error for ML estimates (while `glht` doesn't); ML estimation in general gives a slightly downward-biased estimate of the standard error (by a factor $\sqrt{(n-p)/n}$), so this adjustment should be preferred where available. This is the `adjustSigma` parameter of `summary.lme`:

> adjustSigma: an optional logical value.  If ‘TRUE’ and the estimation
          method used to obtain ‘object’ was maximum likelihood, the
          residual standard error is multiplied by sqrt(nobs/(nobs -
          npar)), converting it to a REML-like estimate. ... Default is ‘TRUE’.

Both of these adjustments should in general make little difference unless your sample is small, but both `adjustSigma=TRUE` and t-tests rather than Z-test are technically more correct, so in a pinch you should probably accept the results of `summary(.)` rather than those of `glht()`.

If you have a factor with more than two levels (so that you need to summarize the joint significance of multiple parameters), you can use `anova()`, which uses F tests (the analog of t-tests) and includes an `adjustSigma` option: if you want to do more complicated *post hoc* testing (e.g. Tukey pairwise comparisons), you will probably need to use `glht()` and accept that your answers will be slightly anticonservative/optimistic.

Try to keep in mind that $p=0.0274$ and $p=0.0493$ (from your example) are not very different from each other; in practice people behave as if there's a magic line at $p=0.05$, but there isn't.

Here's an example:

    library(multcomp)
    library(nlme)
    data("sleepstudy",package="lme4")
                            
    m2 <- lme(Reaction~Days, random = ~Days|Subject,
              data=sleepstudy, method="ML")

Results (fancy code with `printCoefmat()` etc. is just to isolate the information we want from `summary(m2)`):

    printCoefmat(summary(m2)$tTab["Days",,drop=FALSE])
    ##         Value Std.Error       DF t-value   p-value    
    ## Days  10.4673    1.5106 161.0000   6.929 9.651e-11 ***

With `adjustSigma=FALSE`, the standard error changes from 1.5106 to 1.5022:

    printCoefmat(summary(m2,adjustSigma=FALSE)$tTab["Days",,drop=FALSE])
    ##         Value Std.Error       DF t-value   p-value    
    ## Days  10.4673    1.5022 161.0000  6.9678 7.811e-11 ***



A direct calculation of the p-value using the unadjusted sigma:

    2*pt(6.9678,161,lower.tail=FALSE)
    ## [1]  7.811903e-11

If we instead use a Z-test:

    2*pnorm(6.9678,lower.tail=FALSE)
    ## [1] 3.219354e-12

This agrees with the answer we get from `glht`:
                                            
        summary(glht(m2, linfct=c("Days=0")))
    ##           Estimate Std. Error z value Pr(>|z|)    
    ## Days == 0   10.467      1.502   6.968 3.22e-12 ***

In your case most of the difference is from the t- vs Z-test distinction; `2*pt(2.206,df=15,lower.tail=FALSE)` (i.e. using the unadjusted standard error with a t test) gives $p=0.043$, most of the way from $p=0.027$ (`summary(.)` result) to $p=0.049$ (`glht(.)` result).