if you also work in R, you can try the anti_join function of the dplyr package. Here is an example that you need to adapt to your context:
library(dplyr)
gene_list <- read.table("gene_list.txt", header = FALSE, stringsAsFactors = FALSE)
colnames(gene_list) <- "gene_name"
bed_file <- read.table("your_bed_file.bed", header = FALSE, stringsAsFactors = FALSE)
colnames(bed_file) <- c("chr", "start", "end", "gene_name")
filtered_bed <- bed_file %>% anti_join(gene_list, by = "gene_name")
write.table(filtered_bed, file = "filtered_bed_file.bed", sep = "\t", quote = FALSE, row.names = FALSE, col.names = FALSE)