That should work. The idea is to find perfect overlaps between the gr and its reduced form. And then to remove these entries from the original gr.
library(GenomicRanges)
x <- data.frame(chr=c("chr1","chr1","chr2","chr3","chr3"),start=c(1,5,10,10,15),end=c(10,15,20,20,30))
#> x
# chr start end
#1 chr1 1 10
#2 chr1 5 15
#3 chr2 10 20
#4 chr3 10 20
#5 chr3 15 30
gr <- makeGRangesFromDataFrame(x, seqnames.field = "chr",start.field = "start",end.field = "end")
# > gr
# GRanges object with 5 ranges and 0 metadata columns:
# seqnames ranges strand
# <Rle> <IRanges> <Rle>
# [1] chr1 [ 1, 10] *
# [2] chr1 [ 5, 15] *
# [3] chr2 [10, 20] *
# [4] chr3 [10, 20] *
# [5] chr3 [15, 30] *
# -------
# seqinfo: 3 sequences from an unspecified genome; no seqlengths
gr[-queryHits(findOverlaps(gr,reduce(gr),type="equal"))]
# > gr[-queryHits(findOverlaps(gr,reduce(gr),type="equal"))]
# GRanges object with 4 ranges and 0 metadata columns:
# seqnames ranges strand
# <Rle> <IRanges> <Rle>
# [1] chr1 [ 1, 10] *
# [2] chr1 [ 5, 15] *
# [3] chr3 [10, 20] *
# [4] chr3 [15, 30] *
# -------
# seqinfo: 3 sequences from an unspecified genome; no seqlengths